Text-to-Image
MLX
Safetensors
lance
multimodal
apple-silicon
image-generation
video-generation
diffusion
flow-matching
Mixture of Experts
qwen2_5_vl
wan
port
Instructions to use RockTalk/Lance-3B-MLX with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- MLX
How to use RockTalk/Lance-3B-MLX with MLX:
# Download the model from the Hub pip install huggingface_hub[hf_xet] huggingface-cli download --local-dir Lance-3B-MLX RockTalk/Lance-3B-MLX
- Notebooks
- Google Colab
- Kaggle
- Local Apps Settings
- LM Studio
| # MLX port of bytedance/Lance modeling/lance/modeling_utils.py | |
| # Original: Copyright (c) 2025 ByteDance Ltd. and/or its affiliates. Apache 2.0. | |
| import math | |
| import numpy as np | |
| import mlx.core as mx | |
| import mlx.nn as nn | |
| # --------------------------------------------------------------------------- | |
| # Sin-cos position embedding tables (init-time numpy, frozen at runtime) | |
| # --------------------------------------------------------------------------- | |
| def get_1d_sincos_pos_embed_from_grid(embed_dim: int, pos: np.ndarray) -> np.ndarray: | |
| assert embed_dim % 2 == 0 | |
| omega = np.arange(embed_dim // 2, dtype=np.float64) | |
| omega /= embed_dim / 2.0 | |
| omega = 1.0 / 10000 ** omega | |
| pos = pos.reshape(-1) | |
| out = np.einsum("m,d->md", pos, omega) | |
| return np.concatenate([np.sin(out), np.cos(out)], axis=1) | |
| def get_2d_sincos_pos_embed_from_grid(embed_dim: int, grid: np.ndarray) -> np.ndarray: | |
| assert embed_dim % 2 == 0 | |
| emb_h = get_1d_sincos_pos_embed_from_grid(embed_dim // 2, grid[0]) | |
| emb_w = get_1d_sincos_pos_embed_from_grid(embed_dim // 2, grid[1]) | |
| return np.concatenate([emb_h, emb_w], axis=1) | |
| def get_2d_sincos_pos_embed(embed_dim: int, grid_size: int, cls_token: bool = False, extra_tokens: int = 0) -> np.ndarray: | |
| grid_h = np.arange(grid_size, dtype=np.float32) | |
| grid_w = np.arange(grid_size, dtype=np.float32) | |
| grid = np.stack(np.meshgrid(grid_w, grid_h), axis=0) | |
| grid = grid.reshape([2, 1, grid_size, grid_size]) | |
| pos_embed = get_2d_sincos_pos_embed_from_grid(embed_dim, grid) | |
| if cls_token and extra_tokens > 0: | |
| pos_embed = np.concatenate([np.zeros([extra_tokens, embed_dim]), pos_embed], axis=0) | |
| return pos_embed | |
| def get_3d_sincos_pos_embed_from_grid(embed_dim: int, grid: np.ndarray) -> np.ndarray: | |
| assert embed_dim % 2 == 0, "Embedding dimension must be even for 3D embeddings" | |
| d = embed_dim // 3 | |
| d = d if d % 2 == 0 else d - 1 | |
| dim_t, dim_h = d, d | |
| dim_w = embed_dim - 2 * d | |
| assert dim_w % 2 == 0 | |
| emb_t = get_1d_sincos_pos_embed_from_grid(dim_t, grid[0]) | |
| emb_h = get_1d_sincos_pos_embed_from_grid(dim_h, grid[1]) | |
| emb_w = get_1d_sincos_pos_embed_from_grid(dim_w, grid[2]) | |
| return np.concatenate([emb_t, emb_h, emb_w], axis=1) | |
| def get_3d_sincos_pos_embed(embed_dim: int, t: int, h: int, w: int) -> np.ndarray: | |
| grid_t = np.arange(t, dtype=np.float32) | |
| grid_h = np.arange(h, dtype=np.float32) | |
| grid_w = np.arange(w, dtype=np.float32) | |
| tt, hh, ww = np.meshgrid(grid_t, grid_h, grid_w, indexing="ij") | |
| grid = np.stack([tt, hh, ww], axis=0) | |
| return get_3d_sincos_pos_embed_from_grid(embed_dim, grid) | |
| # --------------------------------------------------------------------------- | |
| # Activation lookup (ACT2FN equivalent for the subset Lance uses) | |
| # --------------------------------------------------------------------------- | |
| def _gelu_pytorch_tanh(x: mx.array) -> mx.array: | |
| # Matches torch.nn.functional.gelu(x, approximate="tanh"), which is the | |
| # default for "gelu_pytorch_tanh" in transformers' ACT2FN. | |
| return 0.5 * x * (1.0 + mx.tanh(math.sqrt(2.0 / math.pi) * (x + 0.044715 * x * x * x))) | |
| ACT2FN = { | |
| "gelu": nn.gelu, | |
| "gelu_pytorch_tanh": _gelu_pytorch_tanh, | |
| "gelu_new": _gelu_pytorch_tanh, | |
| "silu": nn.silu, | |
| "swish": nn.silu, | |
| "relu": nn.relu, | |
| } | |
| # --------------------------------------------------------------------------- | |
| # Timestep embedder (DiT-style) | |
| # --------------------------------------------------------------------------- | |
| class TimestepEmbedder(nn.Module): | |
| """Embeds scalar (possibly fractional) timesteps into hidden_size vectors. | |
| PT checkpoint uses nn.Sequential, producing param names mlp.0.{weight,bias} | |
| and mlp.2.{weight,bias}. The convert_weights tool maps mlp.0 -> fc1 and | |
| mlp.2 -> fc2 when loading the Lance safetensors. | |
| """ | |
| def __init__(self, hidden_size: int, frequency_embedding_size: int = 256): | |
| super().__init__() | |
| self.frequency_embedding_size = frequency_embedding_size | |
| self.fc1 = nn.Linear(frequency_embedding_size, hidden_size, bias=True) | |
| self.fc2 = nn.Linear(hidden_size, hidden_size, bias=True) | |
| def timestep_embedding(t: mx.array, dim: int, max_period: float = 10000.0) -> mx.array: | |
| half = dim // 2 | |
| freqs = mx.exp( | |
| -math.log(max_period) * mx.arange(0, half, dtype=mx.float32) / half | |
| ) | |
| args = t.astype(mx.float32)[:, None] * freqs[None] | |
| embedding = mx.concatenate([mx.cos(args), mx.sin(args)], axis=-1) | |
| if dim % 2: | |
| embedding = mx.concatenate([embedding, mx.zeros_like(embedding[:, :1])], axis=-1) | |
| return embedding | |
| def __call__(self, t: mx.array) -> mx.array: | |
| t_freq = self.timestep_embedding(t, self.frequency_embedding_size) | |
| h = self.fc1(t_freq) | |
| h = nn.silu(h) | |
| h = self.fc2(h) | |
| return h | |
| # --------------------------------------------------------------------------- | |
| # MLP connector (vision -> LLM hidden space) | |
| # --------------------------------------------------------------------------- | |
| class MLPconnector(nn.Module): | |
| def __init__(self, in_dim: int, out_dim: int, hidden_act: str): | |
| super().__init__() | |
| if hidden_act not in ACT2FN: | |
| raise ValueError(f"Unsupported activation: {hidden_act!r}") | |
| self._act_name = hidden_act | |
| self.fc1 = nn.Linear(in_dim, out_dim) | |
| self.fc2 = nn.Linear(out_dim, out_dim) | |
| def __call__(self, hidden_states: mx.array) -> mx.array: | |
| h = self.fc1(hidden_states) | |
| h = ACT2FN[self._act_name](h) | |
| h = self.fc2(h) | |
| return h | |
| # --------------------------------------------------------------------------- | |
| # Frozen sin-cos position embedding tables (2D + 3D) | |
| # --------------------------------------------------------------------------- | |
| class PositionEmbedding(nn.Module): | |
| """2D sin-cos lookup table. | |
| Stored as `pos_embed` to match PT param name. Initialized to sin-cos | |
| values; checkpoint load overwrites with identical values (PT also stores | |
| the initialized table as a requires_grad=False Parameter). | |
| """ | |
| def __init__(self, max_num_patch_per_side: int, hidden_size: int): | |
| super().__init__() | |
| self.max_num_patch_per_side = max_num_patch_per_side | |
| self.hidden_size = hidden_size | |
| table = get_2d_sincos_pos_embed(hidden_size, max_num_patch_per_side).astype(np.float32) | |
| self.pos_embed = mx.array(table) | |
| def __call__(self, position_ids: mx.array) -> mx.array: | |
| return self.pos_embed[position_ids] | |
| class PositionEmbedding3D(nn.Module): | |
| """3D sin-cos lookup table over (max_t * max_h * max_w).""" | |
| def __init__(self, max_latent_num_frames: int, max_latent_size: int, hidden_size: int): | |
| super().__init__() | |
| self.max_num_latent_frames = max_latent_num_frames | |
| self.max_latent_size = max_latent_size | |
| self.hidden_size = hidden_size | |
| table = get_3d_sincos_pos_embed( | |
| hidden_size, | |
| max_latent_num_frames, | |
| max_latent_size, | |
| max_latent_size, | |
| ).astype(np.float32) | |
| self.pos_embed = mx.array(table) | |
| def __call__(self, position_ids: mx.array) -> mx.array: | |
| return self.pos_embed[position_ids] | |