Ruby DSL

Ruby DSL#

The Ruby DSL provides high-level ergonomics on top of MLX::NN::Module and MLX::Optimizers while preserving compatibility with native MLX execution.

Core entry points:

  • MLX::DSL::Model

  • MLX::DSL::ModelMixin

  • MLX::DSL::Trainer

  • MLX::DSL::Data

  • MLX::DSL.experiment

  • MLX::DSL.splits

require "mlx"

model = MyModel.new
trainer = model.trainer(optimizer: optimizer) { |x:, y:| loss_fn.call(model.call(x), y) }
data = MLX::DSL::Data.from(train_rows).batch(32)
plan = MLX::DSL.splits { train data }

Quick start:

require "mlx"

class Mlp < MLX::DSL::Model
  option :in_dim
  option :hidden_dim, default: 128
  option :out_dim

  layer :net do
    sequential do
      linear in_dim, hidden_dim
      relu
      linear hidden_dim, out_dim
    end
  end

  def call(x)
    net.call(x)
  end
end

model = Mlp.new(in_dim: 32, out_dim: 10)

Reference pages:

# Typical progression:
# 1) model_declaration + builder_and_graphs
# 2) train_step + trainer_core/trainer_data
# 3) checkpoints_and_resume + artifact_policy
# 4) experiment + split_plan for reusable run configs