TorchDiff (slm388-torchdiff)
TorchDiff (slm388-torchdiff) is a high-performance PyTorch implementation of a Masked Diffusion Language Model (MDLM) with:
- Distributed Training: Native PyTorch FSDP2 (Fully Sharded Data Parallel 2) multi-GPU sharding.
- Hybrid Optimizer: Muon (Newton-Schulz orthogonalization) for 2D hidden matrices + AdamW for embeddings, norms, and heads.
- Curriculum Learning: Automatic pretraining vs. SFT dynamic mixing and context extension (2K $\to$ 4K).
- Fast Loss: Memory-efficient token loss via Apple's Cut Cross-Entropy with automatic PyTorch fallback.
- Hugging Face Jobs Ready: Seamless zero-setup execution with
hf jobs uv runand dataset volume mounting.
1. Installation
From PyPI
pip install slm388-torchdiff
From GitHub Repository
pip install "git+https://github.com/vovaRL/torchdiff.git"
Editable Development Installation
git clone https://github.com/vovaRL/torchdiff.git
cd torchdiff
pip install -e ".[dev]"
2. Dataset: vovaRL/slm388-corpus
TorchDiff is pre-configured to train on the vovaRL/slm388-corpus dataset.
Dataset Overview
- Vocabulary: SmolLM2-compatible (49,152 vocab size, token ID 49,151 as mask token).
- Pretraining Shards: Cosmopedia, DCLM, FineMath, FineWeb-Edu, and Python-Edu
.binbinary token shards. - SFT Shards: SmolTalk instruction tuning shards (
*smoltalk*.bin), dynamically phased in via curriculum scheduling. - Validation Shards: Dedicated held-out validation shards (
*_val_*.bin).
Dynamic Shard Discovery
TorchDiff's CurriculumBinLoader automatically discovers shards and partitions them:
[Dataset Discovery]
Directory: /dataset
Total shards found: 64
├── Pretraining shards: 56
├── SFT shards: 1
└── Validation shards: 7 (held out)
3. Training on Hugging Face Jobs (hf jobs uv run)
Hugging Face Jobs allows you to train on high-end cloud GPUs (A100, H200, A10G) without managing servers or Docker images.
Prerequisites
- Install the Hugging Face CLI:
pip install -U huggingface_hub
- Log in with your write token:
hf auth login
Method A: Run with Published PyPI Package (Recommended)
Mount the dataset volume and pass --clone_to_ssd to copy shards to local NVMe SSD (/tmp/slm388-corpus) for maximum throughput:
hf jobs uv run \
--flavor a100-large \
--secrets HF_TOKEN \
--with slm388-torchdiff \
-v hf://datasets/vovaRL/slm388-corpus:/dataset \
torchdiff-train \
--data_dir /dataset \
--clone_to_ssd \
--batch_size 128 \
--repo_id vovaRL/DiffLM
Method B: Clone directly from Hugging Face Hub to Local SSD (Zero Mounts)
HF Jobs nodes (e.g. a100-large with 1,000 GB NVMe SSD) download cloud-to-cloud directly to local SSD:
hf jobs uv run \
--flavor a100-large \
--secrets HF_TOKEN \
--with slm388-torchdiff \
torchdiff-train \
--data_dir /tmp/slm388-corpus \
--batch_size 128 \
--repo_id vovaRL/DiffLM
Method C: Run Standalone Script with Local SSD
Run the self-contained script train_standalone.py locally from this repository:
hf jobs uv run \
--flavor a100-large \
--secrets HF_TOKEN \
-v hf://datasets/vovaRL/slm388-corpus:/dataset \
train_standalone.py \
--data_dir /dataset \
--clone_to_ssd \
--batch_size 128 \
--repo_id vovaRL/DiffLM
Multi-GPU Training (FSDP2)
Scale to multi-GPU flavors (e.g. 4x or 8x A100):
hf jobs uv run \
--flavor a100x4 \
--secrets HF_TOKEN \
--with slm388-torchdiff \
-v hf://datasets/vovaRL/slm388-corpus:/dataset \
torchdiff-train \
--data_dir /dataset \
--batch_size 256 \
--repo_id vovaRL/DiffLM
Persistent Bucket Checkpointing
Mount a Hugging Face Bucket as a read-write volume to save checkpoints continuously:
hf jobs uv run \
--flavor a100-large \
--secrets HF_TOKEN \
--with slm388-torchdiff \
-v hf://datasets/vovaRL/slm388-corpus:/dataset \
-v hf://buckets/vovaRL/diff-checkpoints:/checkpoints \
torchdiff-train \
--data_dir /dataset \
--checkpoint_dir /checkpoints \
--checkpoint_interval 1000
4. Local Execution
Run Training Locally (Multi-GPU or Single-GPU)
# Single GPU (e.g. RTX 6000 96GB Blackwell Server or 48GB Ada):
# Using gradient accumulation to preserve the full 512 effective global batch size:
python train.py --data_dir ./data --batch_size 512 --micro_batch_size 128
# Or with activation checkpointing to further reduce activation memory:
python train.py --data_dir ./data --batch_size 512 --micro_batch_size 128 --gradient_checkpointing
# Or using uv run:
uv run train.py --data_dir ./data --batch_size 512 --micro_batch_size 128
Benchmark Mode
Benchmark raw forward/backward throughput without downloading the full dataset:
python train.py --mode bench --synthetic_bench --batch_size 512 --micro_batch_size 128 --seq_len 2048
5. CLI Arguments
| Flag | Default | Description |
|---|---|---|
--mode |
train |
Mode: 'train' or 'bench'. |
--data_dir |
None |
Directory containing .bin shards. Auto-detects /dataset, /data, ./data. |
--dataset |
vovaRL/slm388-corpus |
Hugging Face dataset repo ID to download if local shards are not found. |
--download_pattern |
None |
Glob pattern for partial dataset download (e.g. '*.bin'). |
--batch_size |
512 |
Effective global batch size across all GPUs and accumulation steps. |
--micro_batch_size |
None |
Micro-batch size per forward pass. When set (e.g. 128 for 96GB GPU, 64 for 48GB GPU), gradient accumulation is automatically computed. |
--grad_accum_steps |
None |
Explicit gradient accumulation steps per optimizer update. Overrides micro_batch_size calculation if provided. |
--gradient_checkpointing |
False |
Enable activation checkpointing across diffusion blocks to drastically reduce VRAM usage. |
--seq_len |
2048 |
Initial token context length (extends to 4096 in Phase 4). |
--total_steps |
85000 |
Total pretraining steps. |
--checkpoint |
None |
Path to .safetensors checkpoint to resume training. |
--checkpoint_dir |
./checkpoints |
Local/volume checkpoint directory. |
--checkpoint_interval |
2500 |
Steps between saving checkpoints. |
--repo_id |
$HF_REPO_ID |
Hugging Face model repository to upload saved checkpoints. |
--no_compile |
False |
Disable torch.compile. |
6. Building and Publishing to PyPI
Build sdist and wheel:
uv build
# or: python -m build
Upload to PyPI using Twine:
twine upload dist/*
License
MIT License. See LICENSE for details.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file slm388_torchdiff-0.1.52.tar.gz.
File metadata
- Download URL: slm388_torchdiff-0.1.52.tar.gz
- Upload date:
- Size: 47.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.14.4
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
974756c605cbbb861b722683190dcc2e9c9b2bad3b6c3cbe1bb53172899f71a7
|
|
| MD5 |
000cc94bac4fb6566d97a6b03a235216
|
|
| BLAKE2b-256 |
9173c4708679b07be95aea72d34d0933a38e2f38feafd0343a7a96e3cfdafc98
|
File details
Details for the file slm388_torchdiff-0.1.52-py3-none-any.whl.
File metadata
- Download URL: slm388_torchdiff-0.1.52-py3-none-any.whl
- Upload date:
- Size: 51.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.14.4
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
963d0f9da2c056ac1ba7213a7043ef7fed247bd916330b6aa405f841a3a7ea2e
|
|
| MD5 |
f1e4ffb1daff405caafce8e25e37157b
|
|
| BLAKE2b-256 |
1ac998ae14e6286a65ca45acddeb23ac5cebd37537bacddb57657296ad5359ce
|