跳到主要内容

运行固定 Hello World 训练 Job

这是完整的最小托管 CLI 训练示例。在 Qwen/Qwen3.5-4B 上执行十步真实 LoRA 训练,并检查生成的 Hello, world!。它会分配付费资源。需要由 Python 控制训练循环时,使用 SFT 快速开始。

准备请求​

先完成安装和认证。项目 Key 需要训练读写、checkpoint 下载和资源清理权限,账户余额需足以支付训练预留费用。使用自己的项目 Key;该训练服务不可用时请联系支持。

将下面内容保存为 hello-world.json。保留四条消息和固定配方参数,不修改数据。这一 hello-world 请求不接受任意 Dataset。固定配方使用 rank 16、seed 42 和学习率 0.0002;资源由平台选择。

{
"request_id": "hello-world-4b-001",
"base_model": "Qwen/Qwen3.5-4B",
"recipe": "hello-world",
"max_steps": 10,
"max_length": 512,
"per_device_train_batch_size": 4,
"gradient_accumulation_steps": 1,
"records": [
{"messages": [{"role": "user", "content": "Say hello to the world."}, {"role": "assistant", "content": "Hello, world!"}]},
{"messages": [{"role": "user", "content": "Write the classic programming greeting."}, {"role": "assistant", "content": "Hello, world!"}]},
{"messages": [{"role": "user", "content": "What should a hello world program print?"}, {"role": "assistant", "content": "Hello, world!"}]},
{"messages": [{"role": "user", "content": "Greet everyone with the traditional first-program message."}, {"role": "assistant", "content": "Hello, world!"}]}
]
}

提交一次并保存回执​

下面先生成唯一 request ID,再提交请求。每个新实验只执行一次 ID 生成;网络重试复用同一个文件和 ID,不重新生成。

el auth status --check
python - <<'PYCODE'
import json
import uuid
from pathlib import Path
path = Path("hello-world.json")
request = json.loads(path.read_text())
request["request_id"] = "hello-world-" + uuid.uuid4().hex
path.write_text(json.dumps(request, indent=2) + "\n")
PYCODE
el job submit --type train --file hello-world.json > submit.json

从 submit.json 读取 job_id,替换下文的 YOUR_JOB_ID。提交返回时,资源准备和训练可能尚未完成。保存请求与回执;响应不确定时先查询已有 Job,不直接提交另一个实验。

观察训练与模型输出​

el job get YOUR_JOB_ID > status.json
el trail list --type train --job-id YOUR_JOB_ID --json
el job log YOUR_JOB_ID --source all --follow --json > logs.ndjson
el job result YOUR_JOB_ID > result.json
el checkpoint list --job-id YOUR_JOB_ID --json > checkpoints.json

重复 job get 直到终态。日志采集达到 EOF 后 job log --follow 结束,Ctrl-C 只停止日志读取。通过要求是 status=completed、training.validation_mode=cloud,且 training.hello_world 包含十步、rank 16、seed 42、学习率 0.0002、十个有限 loss,以及 sample_response="Hello, world!"。这是固定的功能检查,不是模型质量评测。只有提交回执或非空日志不能证明成功。

控制台 Jobs → 对应 Train Job → Trials / Logs / Metrics / Checkpoints 提供相同的只读观察。公开训练只支持托管 Job;交互式 SDK 训练会话已退役。

下载保存的文件​

从 checkpoints.json 选择返回的完整 checkpoint 路径,不能用 Job ID 自行拼接。替换下文的 YOUR_CHECKPOINT_PATH 并使用新的目标目录:

el checkpoint download YOUR_CHECKPOINT_PATH ./verified-checkpoint --job-id YOUR_JOB_ID > download.json

下载器根据注册元数据校验文件大小和 SHA-256。保留实际文件与 download.json。下载中断后使用相同目录重试;完整文件重新校验后复用,对过期对象链接逐文件最多刷新一次授权。上传中的 checkpoint 可能还没有文件;等待注册/发布后重试下载,不重新训练。列表可能分页,使用相同 Job 过滤和 next_cursor 读取后续页。

这个 4B 示例覆盖训练和配方内的采样输出。独立 serving 需要兼容的已发布 profile,不要猜测 4B serving profile;单独的训练并部署示例使用 Qwen/Qwen3.8-27B 与 qwen38-27b@1。

停止并验证资源清理​

中断正在运行的 Job 使用 job stop。已完成的 Job 先读取终态,再确认资源清理。把下面 JSON 数组保存为 cleanup.json 并替换 Job ID;为本次清理设置新的唯一 request ID。

el job stop YOUR_JOB_ID > stop.json
el job get YOUR_JOB_ID > final-status.json
[{"kind": "training_job", "id": "YOUR_JOB_ID"}]
el setting cleanup --file cleanup.json --request-id YOUR_UNIQUE_CLEANUP_ID --wait > cleanup-receipt.json
el setting operation get YOUR_OPERATION_ID

最后一条查询使用 cleanup-receipt.json 返回的 operation_id。只有 Operation 为 SUCCEEDED 且无错误才算清理完成。--wait 超时后保留 Operation ID 并继续查询,不创建新 Job。本次清理仅选择该训练 Job,保留下载文件和已注册 checkpoint。以后不再需要远端 checkpoint 时,先保留所需文件,再将列表中的 resource_id 传给 el checkpoint delete RESOURCE_ID --wait。

继续阅读多个训练 Trial、Checkpoint 恢复或 SDK 快速开始。