[ PROMPT_NODE_22502 ]
Infrastructure Modal 高级用法
[ SKILL_DOCUMENTATION ]
# Modal 高级用法指南
## 多 GPU 训练
### 单节点多 GPU
python
import modal
app = modal.App("multi-gpu-training")
image = modal.Image.debian_slim().pip_install("torch", "transformers", "accelerate")
@app.function(gpu="H100:4", image=image, timeout=7200)
def train_multi_gpu():
from accelerate import Accelerator
accelerator = Accelerator()
model, optimizer, dataloader = accelerator.prepare(model, optimizer, dataloader)
for batch in dataloader:
outputs = model(**batch)
loss = outputs.loss
accelerator.backward(loss)
optimizer.step()
### DeepSpeed 集成
python
image = modal.Image.debian_slim().pip_install(
"torch", "transformers", "deepspeed", "accelerate"
)
@app.function(gpu="A100:8", image=image, timeout=14400)
def deepspeed_train(config: dict):
from transformers import Trainer, TrainingArguments
args = TrainingArguments(
output_dir="/outputs",
deepspeed="ds_config.json",
fp16=True,
per_device_train_batch_size=4,
gradient_accumulation_steps=4
)
trainer = Trainer(model=model, args=args, train_dataset=dataset)
trainer.train()
### 多 GPU 注意事项
对于重新执行 Python 入口点的框架(如 PyTorch Lightning),请使用:
- `ddp_spawn` 或 `ddp_notebook` 策略
- 将训练作为子进程运行以避免问题
python
@app.function(gpu="H100:4")
def train_with_subprocess():
import subprocess
subprocess.run(["python", "-m", "torch.distributed.launch", "train.py"])
## 高级容器配置
### 用于缓存的多阶段构建
python
# 阶段 1: 基础依赖 (已缓存)
base_image = modal.Image.debian_slim().pip_install("torch", "numpy", "scipy")
# 阶段 2: ML 库 (单独缓存)
ml_image = base_image.pip_install("transformers", "datasets", "accelerate")
# 阶段 3: 自定义代码 (更改时重建)
final_image = ml_image.copy_local_dir("./src", "/app/src")
### 自定义 Dockerfile
python
image = modal.Image.from_dockerfile("./Dockerfile")
### 从 Git 安装
python
image = modal.Image.debian_slim().pip_install(
"git+https://github.com/huggingface/transformers.git@main"
)
### 使用 uv 加速安装
python
image = modal.Image.debian_slim().uv_pip_install(
"torch", "transformers", "accelerate"
)
## 高级类模式
### 生命周期钩子
python
@app.cls(gpu="A10G")
class InferenceService:
# ...