
用 SkyPilot 在你的自有基础设施上微调 Llama 3.1torchtune LoRA 全流程指南【免费下载链接】skypilotThe AI Compute Platform for frontier teams. SkyPilot turns fragmented AI compute into one AI supercomputer, so frontier AI teams build custom intelligence faster.项目地址: https://gitcode.com/GitHub_Trending/sk/skypilot本指南基于 SkyPilot 仓库llm/llama-3_1-finetuning目录下的完整示例讲解如何在本地 GPU 工作站、Kubernetes 集群或任意云账号上用 torchtune 对 Meta Llama 3.1 进行 LoRA 微调并用 vLLM 一键部署微调后的模型。读完本文你将掌握一条sky launch命令完成下载权重、多卡分布式微调、checkpoint 持久化到对象存储、模型服务的完整闭环方案并能无缝切换到自己的私有数据集。Llama 3.1 与 LoRA 微调背景2024 年 7 月 23 日Meta 发布了 Llama 3.1 模型家族其中包括 405B 参数的基础模型与指令微调版本。Llama 3.1 405B 成为首个在多项基准上接近 GPT-4o、Claude 3.5 Sonnet 等顶级闭源模型的开放权重 LLM。在自有数据上微调这样的大模型传统全参微调Full Fine-tuning对显存与训练时间的要求极高。本示例采用LoRALow-Rank Adaptation方案冻结基座模型权重仅在注意力层的低秩子空间内训练少量适配器参数。这样不仅大幅降低显存占用还让微调产物变得极其轻量——服务阶段只需要适配器文件无需搬动整个大模型。本示例的技术栈是SkyPilot torchtunetorchtune是 PyTorch 官方生态的 LLM 微调框架内置 Llama 3.1 的 LoRA 训练配方recipe与分布式支持SkyPilot负责把整个微调任务封装成一个声明式 YAML在任何自有基础设施上用同一套接口启动。前置准备Appendix: Preparation1. 申请 Llama 3.1 权重访问权限在 Hugging Face 上访问 Meta-Llama-3.1-8B-Instruct 模型页面点击页面中的蓝色授权框并完成 Meta 的许可协议确认。这是下载与使用 Llama 3.1 权重的必要条件gated model。2. 获取 Hugging Face Access Token在 Hugging Face Settings → Tokens 页面创建或复用一个访问令牌。这个 token 将用于tune download从 Hugging Face Hub 拉取受控模型权重。3. 将 Token 注入环境变量export HF_TOKENxxxx在后续sky launch中通过--secret HF_TOKEN把该环境变量安全地传递给远端集群避免把密钥明文写进 YAML详见下文secrets 机制。4. 安装 SkyPilotpip install skypilot-nightly[aws,gcp,kubernetes]方括号内为云厂商的安装扩展可按自己已配置的云账号选择SkyPilot 支持 12 种云 Kubernetes详见 安装文档。5. 检查基础设施可用性sky check Enabled clouds ✔ AWS ✔ GCP ✔ Azure ✔ OCI ✔ Lambda ✔ RunPod ✔ Paperspace ✔ Fluidstack ✔ Cudo ✔ IBM ✔ SCP ✔ vSphere ✔ Cloudflare (for R2 object store) ✔ Kubernetessky check会探测当前环境已配置并启用的云账号。完成以上五步后即可开始微调。一键启动 Llama 3.1 LoRA 微调微调任务被完整封装在 lora.yaml 中。这是一个标准的 SkyPilot 任务 YAML包含envs环境变量、resources资源申请、file_mounts文件挂载、setup环境初始化、run任务主体五个核心段。启动命令# 下载示例文件 git clone https://github.com/skypilot-org/skypilot cd skypilot/llm/llama-3_1-finetuning export HF_TOKENxxxx # 在 8 张 A100 GPU 上对 Alpaca 数据集做 8B 模型的 LoRA 微调约需 40 分钟 sky launch -c llama31 lora.yaml \ --secret HF_TOKEN --env MODEL_SIZE8B \ --env CHECKPOINT_BUCKET_NAMEyour-own-bucket-name-c llama31指定集群名称SkyPilot 会按需创建或复用该集群--secret HF_TOKEN将本地的 Hugging Face token 安全传递到远端走加密通道不出现在任务定义文件里--env用于覆盖 YAML 中envs段的默认值。要微调 70B 模型只需更换参数sky launch -c llama31-70 lora.yaml \ --secret HF_TOKEN --env MODEL_SIZE70B \ --env CHECKPOINT_BUCKET_NAMEyour-own-bucket-name微调任务 YAML 详解lora.yaml 完整内容如下# LoRA finetuning Meta Llama-3.1 on any of your own infra. # # Usage: # # HF_TOKENxxx sky launch lora.yaml -c llama31 --secret HF_TOKEN # # To finetune a 70B model: # # HF_TOKENxxx sky launch lora.yaml -c llama31-70 --secret HF_TOKEN --env MODEL_SIZE70B envs: MODEL_SIZE: 8B DATASET: yahma/alpaca-cleaned # Change this to your own checkpoint bucket CHECKPOINT_BUCKET_NAME: sky-llama-31-checkpoints secrets: HF_TOKEN: null # Pass with --secret HF_TOKEN in CLI resources: accelerators: A100:8 disk_tier: best use_spot: true file_mounts: /configs: ./configs /output: name: $CHECKPOINT_BUCKET_NAME mode: MOUNT # Optionally, specify the store to enforce to use one of the stores below: # r2/azure/gcs/s3/cos # store: r2 setup: | pip install torch2.4.0 torchvision # Install torch tune from source for the latest Llama-3.1 model pip install githttps://github.com/pytorch/torchtune.git58255001bd0b1e3a81a6302201024e472af05379 # pip install torchtune tune download meta-llama/Meta-Llama-3.1-${MODEL_SIZE}-Instruct \ --hf-token $HF_TOKEN \ --output-dir /tmp/Meta-Llama-3.1-${MODEL_SIZE}-Instruct \ --ignore-patterns original/consolidated* run: | tune run --nproc_per_node $SKYPILOT_NUM_GPUS_PER_NODE \ lora_finetune_distributed \ --config /configs/${MODEL_SIZE}-lora.yaml \ dataset.source$DATASET # Remove the checkpoint files to save space, LoRA serving only needs the # adapter files. rm /tmp/Meta-Llama-3.1-${MODEL_SIZE}-Instruct/*.pt rm /tmp/Meta-Llama-3.1-${MODEL_SIZE}-Instruct/*.safetensors mkdir -p /output/$MODEL_SIZE-lora rsync -Pavz /tmp/Meta-Llama-3.1-${MODEL_SIZE}-Instruct /output/$MODEL_SIZE-lora cp -r /tmp/lora_finetune_output /output/$MODEL_SIZE-lora/逐段解读envs环境变量MODEL_SIZE: 8B微调目标规模可选8B或70B决定下载的权重与使用的 torchtune 配置DATASET: yahma/alpaca-cleanedHugging Face 数据集路径可通过--env DATASET...覆盖为自有数据集CHECKPOINT_BUCKET_NAME存储 checkpoint 的对象存储桶名通过--env传入自己的桶。secrets密钥HF_TOKEN: null声明该环境变量为敏感密钥通过 CLI 的--secret HF_TOKEN传入。SkyPilot 对 secrets 做了特殊处理密钥通过安全通道注入集群且不会写入任务定义明文源码层面由 sky/task.py 中的校验逻辑确保 Docker 登录类变量要么走envs要么走secrets不会混用泄露。resources资源申请accelerators: A100:8申请 8 张 A100满足 70B LoRA 的分布式训练需求disk_tier: best为模型下载与 checkpoint 落盘申请高性能磁盘use_spot: true允许使用竞价实例降低成本——SkyPilot 会为竞价实例自动处理抢占恢复task 具备幂等性失败可重启续训。file_mounts文件挂载/configs: ./configs把本地的 torchtune 配置目录configs/上传到远端/configs/output将名为$CHECKPOINT_BUCKET_NAME的对象存储桶以MOUNT模式挂载到/output。这里体现了 SkyPilot 的存储抽象同一份 YAML 中的name桶会自动被创建若不存在并可按需通过store字段r2/azure/gcs/s3/cos强制指定底层对象存储厂商。setup一次性环境初始化安装torch2.4.0与torchvision从源码安装指定 commit 的 torchtune58255001...以获取对 Llama 3.1 的最新支持发行版可用pip install torchtune替代用tune download下载对应规模的 Instruct 权重--ignore-patterns original/consolidated*跳过非必要的原始格式权重加速下载。run任务主体tune run --nproc_per_node $SKYPILOT_NUM_GPUS_PER_NODE lora_finetune_distributed启动 torchtune 的多卡 LoRA 分布式微调。$SKYPILOT_NUM_GPUS_PER_NODE是 SkyPilot 自动注入的运行时环境变量取值为该节点实际分配的 GPU 数量——这正是本示例能一份 YAML 同时适配单机多卡与多机的关键它由 SkyPilot 在生成任务脚本时动态计算并注入见 sky/backends/task_codegen.py其定义位于 sky/skylet/constants.py--config /configs/${MODEL_SIZE}-lora.yaml选择与模型规模匹配的 torchtune 配置见下一节dataset.source$DATASET命令行覆盖数据集配置项训练结束后删除基座权重文件.pt、.safetensors以节省对象存储空间——因为 LoRA 服务阶段只需要适配器文件将模型目录与/tmp/lora_finetune_output训练输出、适配器与日志同步到挂载的/output/$MODEL_SIZE-lora桶目录实现 checkpoint 的持久化。torchtune 微调配置8B 与 70B 的差异/configs目录下提供两份 torchtune 配方配置8B-lora.yaml与70B-lora.yaml分别对应单机 8 卡内可完成的两种规模。8B 配置要点configs/8B-lora.yamlmodel: _component_: torchtune.models.llama3_1.lora_llama3_1_8b lora_attn_modules: [q_proj, v_proj] apply_lora_to_mlp: False apply_lora_to_output: False lora_rank: 8 lora_alpha: 16 tokenizer: _component_: torchtune.models.llama3.llama3_tokenizer path: /tmp/Meta-Llama-3.1-8B-Instruct/original/tokenizer.model checkpointer: _component_: torchtune.utils.FullModelHFCheckpointer checkpoint_dir: /tmp/Meta-Llama-3.1-8B-Instruct/ checkpoint_files: [ model-00001-of-00004.safetensors, model-00002-of-00004.safetensors, model-00003-of-00004.safetensors, model-00004-of-00004.safetensors ] recipe_checkpoint: null output_dir: /tmp/Meta-Llama-3.1-8B-Instruct/ model_type: LLAMA3 resume_from_checkpoint: False dataset: _component_: torchtune.datasets.alpaca_cleaned_dataset seed: null shuffle: True batch_size: 2 optimizer: _component_: torch.optim.AdamW weight_decay: 0.01 lr: 3e-4 lr_scheduler: _component_: torchtune.modules.get_cosine_schedule_with_warmup num_warmup_steps: 100 loss: _component_: torch.nn.CrossEntropyLoss epochs: 1 max_steps_per_epoch: null gradient_accumulation_steps: 32 output_dir: /tmp/lora_finetune_output metric_logger: _component_: torchtune.utils.metric_logging.DiskLogger log_dir: ${output_dir} log_every_n_steps: 1 log_peak_memory_stats: False device: cuda dtype: bf16 enable_activation_checkpointing: False关键点LoRA 作用范围8B 配置仅对注意力层的q_proj、v_proj注入低秩适配器lora_rank8、lora_alpha16不作用于 MLP 与输出层——这是显存与效果之间的经典折中checkpointer使用FullModelHFCheckpointer按 HF 分片清单读取 4 个 safetensors 分片model_type: LLAMA3训练超参batch_size2配合gradient_accumulation_steps32等效全局 batch size 为 64lr3e-4 余弦退火调度100 步预热1 个 epoch精度dtype: bf16混合精度训练以适配 A1008B 规模未开启 activation checkpointing。70B 配置要点configs/70B-lora.yaml70B 与 8B 配置的主要差异配置项8B70B模型组件lora_llama3_1_8blora_llama3_1_70bLoRA 模块[q_proj, v_proj][q_proj, k_proj, v_proj]lora_rank / lora_alpha8 / 1616 / 32checkpoint 分片4 个 safetensors30 个 safetensors数据集组件alpaca_cleaned_datasetalpaca_datasetgradient_accumulation_steps321enable_activation_checkpointingFalseTrue最低 GPU 需求2 卡8 卡70B 由于参数量大扩大了 LoRA 秩16/32并扩展到k_proj同时开启 activation checkpointing以显著降低中间激活的显存占用训练调度上gradient_accumulation_steps1即不做梯度累积。配置头部注释明确说明此配置需要 8 张 GPU 运行tune run --nproc_per_node 8 ... --config llama3_1/70B_lora与示例 YAML 中A100:8的资源申请严格对应。使用你自己的数据集默认示例使用 yahma/alpaca-cleaned Alpaca 数据集但在真实场景中往往需要针对业务数据微调。SkyPilot 通过--env DATASET覆盖实现零改动切换数据集# 在 8 张 A100 GPU 上对 finance 数据集做 8B 模型的 LoRA 微调约需 1 小时 sky launch -c llama31 lora.yaml \ --secret HF_TOKEN --env MODEL_SIZE8B \ --env CHECKPOINT_BUCKET_NAMEyour-own-bucket-name \ --env DATASETgbharti/finance-alpaca这里以 gbharti/finance-alpaca 金融数据集为例。原理上DATASET环境变量在run阶段被注入为dataset.source$DATASET作为命令行覆盖项传给 torchtune。只要你的数据集是 Hugging Face 上公开或可用 HF_TOKEN 访问的datasets格式且结构与 Alpaca 一致instruction/input/output 字段即可无缝替换。服务微调后的模型训练完成后checkpoint 已持久化到你的对象存储桶。现在用 vLLM 以 OpenAI 兼容 API 提供 LoRA 服务——无需加载完整权重只需要适配器文件。注意CHECKPOINT_BUCKET_NAME必须是上一步微调时使用的同一个桶。sky launch -c serve-llama31 serve.yaml \ --env LORA_NAMEmy-finance-lora \ --env CHECKPOINT_BUCEKT_NAMEyour-own-bucket-name服务 YAML 详解serve.yaml# Serve a LoRA finetuned Meta Llama-3.1. # # Usage: # # HF_TOKENxxx sky launch serve.yaml -c llama31-serve --secret HF_TOKEN envs: MODEL_SIZE: 8B HF_TOKEN: # Change this to your checkpoint bucket created in lora.yaml CHECKPOINT_BUCKET_NAME: your-checkpoint-bucket LORA_NAME: my-finance-lora resources: accelerators: L4 ports: 8081 cpus: 32 file_mounts: /checkpoints: name: $CHECKPOINT_BUCKET_NAME mode: MOUNT setup: | pip install vllm0.5.3post1 pip install vllm-flash-attn2.5.9.post1 pip install openai run: | vllm serve meta-llama/Meta-Llama-3.1-${MODEL_SIZE}-Instruct \ --tensor-parallel-size $SKYPILOT_NUM_GPUS_PER_NODE --enable-lora \ --lora-modules $LORA_NAME/checkpoints/${MODEL_SIZE}-lora/Meta-Llama-3.1-${MODEL_SIZE}-Instruct/ \ --max-model-len2048 --port 8081服务端配置的几个关键点资源大幅降级微调用 8×A100服务只申请单张 L4accelerators: L4与cpus: 32——这正是 LoRA 路线的收益一个轻量服务节点即可承载多个适配器ports: 8081声明对外暴露 8081 端口SkyPilot 会自动完成端口映射与防火墙配置sky status --endpoint可查询公网端点文件挂载同一个 checkpoint 桶以MOUNT模式挂载到/checkpoints服务节点直接读取适配器文件无需额外拷贝--enable-lora与--lora-modulesvLLM 的 LoRA 加载开关$LORA_NAME/checkpoints/...将微调阶段同步到桶里的适配器目录注册为一个可调用的 LoRA 模块对应微调 YAML 中的/output/$MODEL_SIZE-lora目录结构--tensor-parallel-size $SKYPILOT_NUM_GPUS_PER_NODE再次使用 SkyPilot 注入的 GPU 数量环境变量实现张量并行度与节点显卡数自动对齐。与模型交互获取服务端点后用 OpenAI 兼容的 chat completions 接口测试ENDPOINT$(sky status --endpoint 8081 serve-llama31) curl http://$ENDPOINT/v1/chat/completions \ -H Content-Type: application/json \ -d { model: my-finance-lora, messages: [ { role: system, content: You are a helpful assistant. }, { role: user, content: For a car, what scams can be plotted with 0% financing vs rebate? } ] } | jq .sky status --endpoint 8081 serve-llama31会输出该服务集群暴露 8081 端口的可访问地址请求体中的model: my-finance-lora必须与--env LORA_NAME传入的名称一致vLLM 才会路由到对应的 LoRA 适配器。从源码看 SkyPilot 的关键机制示例中反复出现的$SKYPILOT_NUM_GPUS_PER_NODE是理解整套流程自动化的钥匙。在 sky/skylet/constants.py 中它被定义为 SkyPilot 运行时环境变量族SKYPILOT_前缀的一员在任务代码生成阶段sky/backends/task_codegen.pySkyPilot 会读取任务资源中 GPU 数量在节点启动时把该变量注入任务进程值为该节点实际分配到的 GPU 数。因此微调阶段tune run --nproc_per_node $SKYPILOT_NUM_GPUS_PER_NODE的多卡进程数由 SkyPilot 自动对齐无需手写服务阶段--tensor-parallel-size $SKYPILOT_NUM_GPUS_PER_NODE同理。类似地secrets机制在 sky/task.py 中有专门校验Docker 登录类环境变量要求要么全部走envs、要么全部走secrets避免密钥与明文变量混用导致意外泄露。本示例选择--secret HF_TOKEN正是利用这一安全通道。更进一步至此你已经完成自有数据 → 私有基础设施 → 微调 → 私有服务的完整闭环所有模型权重、checkpoint 与服务副本都停留在你自己的私有基础设施内不会经过任何第三方托管平台。若需微调 405B 规模模型官方示例仍在演进中可关注 SkyPilot 社区讨论与仓库更新。更多参考资源仓库内可读SkyPilot 快速上手文档SkyPilot 安装文档SkyPilot AI 示例画廊llm 目录下的更多微调与推理示例SkyPilot 任务 YAML 语法参考【免费下载链接】skypilotThe AI Compute Platform for frontier teams. SkyPilot turns fragmented AI compute into one AI supercomputer, so frontier AI teams build custom intelligence faster.项目地址: https://gitcode.com/GitHub_Trending/sk/skypilot创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考