ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

用 SkyPilot 在任意云或 Kubernetes 上一条命令部署与规模化 Llama 3 服务

用 SkyPilot 在任意云或 Kubernetes 上一条命令部署与规模化 Llama 3 服务 用 SkyPilot 在任意云或 Kubernetes 上一条命令部署与规模化 Llama 3 服务【免费下载链接】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 实战指南的深度技术教程讲解如何在你自己名下的云账号AWS、Azure、GCP、Lambda Cloud、IBM、Samsung、OCI 等或 Kubernetes 集群中用一条命令部署私有的 Llama 3 聊天服务并通过 SkyServe 实现多副本负载均衡与自动恢复。读完本文你将掌握完整服务 YAML 的每个字段含义、单实例与可扩展两种部署路径、OpenAI 兼容 API 与 Gradio UI 的调用方式以及如何将 GUI 与后端服务解耦部署。为什么用 SkyPilot 而不是商业托管方案Meta 发布的 Llama 3 开源大模型附带允许商业使用的许可证这让团队可以在自有基础设施上部署私有的 Llama 3 服务。相比直接购买商业托管 API基于 SkyPilot 自托管有以下核心优势无锁定No lock-in同一份 YAML 可在任意受支持的云上运行——AWS、Azure、GCP、Lambda Cloud、IBM、Samsung、OCI 等数据不出账号所有虚拟机与存储桶都在你自己的云账号内聊天历史不会经过任何第三方托管方成本最低没有托管方案的加价只需支付云厂商本身的资源费用自由选型可以按预算自由选择模型尺寸、GPU 类型、GPU 数量。而这一切都由 SkyPilot 自动完成基础设施调度机型选择、端口开放、依赖安装、健康检查对用户来说只相当于“一条命令”。前置条件在部署之前需要完成三步准备获取模型访问权前往 HuggingFace 模型页meta-llama/Meta-Llama-3-70B-Instruct申请访问权限获取后得到你的HF_TOKEN安装 SkyPilot参照项目根目录 README.md 与安装文档完成 SkyPilot 安装校验云端就绪运行sky check确认至少有一个云服务商或 Kubernetes 集群处于Enabled状态。在仓库根目录执行sky check时SkyPilot 会逐项探测各云账号的凭据配置与 Kubernetes 的~/.kube/config输出每个后端的可用状态这是后续所有命令能顺利执行的前提。SkyPilot YAML 逐段解读完整的部署配方位于仓库 llm/llama-3/llama3.yaml以下按段解析其核心设计。环境变量与密钥envs / secretsenvs: MODEL_NAME: meta-llama/Meta-Llama-3-70B-Instruct # MODEL_NAME: meta-llama/Meta-Llama-3-8B-Instruct secrets: HF_TOKEN: null # Pass with --secret HF_TOKEN in CLIenvs.MODEL_NAME指定要加载的 HuggingFace 模型名默认是 70B Instruct 版切换到 8B 只需把注释打开并注释掉上一行secrets.HF_TOKEN通过命令行--secret HF_TOKEN传入避免把密钥写死在 YAML 中。运行时它会被注入为环境变量供 vLLM 拉取模型权重时鉴权。服务定义serviceservice: replicas: 2 # An actual request for readiness probe. readiness_probe: path: /v1/chat/completions post_data: model: $MODEL_NAME messages: - role: user content: Hello! What is your name? max_tokens: 1这是 SkyServe 的编排配置replicas: 2表示保持 2 个副本readiness_probe向副本发出一个真实的/v1/chat/completions请求仅生成 1 个 token只有返回成功该副本才被标记为 READY 并接入流量。从源码看SkyServe 对readiness_probe的解析位于 sky/serve/service_spec.py支持path、post_data、initial_delay_seconds、timeout_seconds、endpoint_probe_interval_seconds、consecutive_failure_threshold_timeout、headers等字段其中post_data若以字符串形式提供会被json.loads解析为 JSONinitial_delay_seconds等未显式配置的字段会回落到constants中的默认值。这种“真实业务请求”的探测比简单的 HTTP GET 更能准确反映模型是否真正可用。资源定义resourcesresources: accelerators: {L4:8, A10g:8, A10:8, A100:4, A100:8, A100-80GB:2, A100-80GB:4, A100-80GB:8} # accelerators: {L4, A10g, A10, L40, A40, A100, A100-80GB} # We can use cheaper accelerators for 8B model. cpus: 32 use_spot: True disk_size: 512 # Ensure model checkpoints can fit. disk_tier: best ports: 8081 # Expose to internet traffic.这里的设计体现了 SkyPilot 的核心能力——跨云资源优选accelerators不是指定某一台机器而是一个候选集合{L4:8, A10g:8, ..., A100-80GB:8}。SkyPilot 的优化器会结合实时价格在所有云的所有区域中挑选满足“至少拥有其中一种 GPU 规格”的最便宜可用实例详见下文优化器输出示例70B 模型需要至少 2 张 A100-80GB 或 4 张 A100 级别的显存8B 模型则可以放宽到单卡 L4/A10g/A10/L40/A40/A100/A100-80GB注释行给出了 8B 的推荐加速器集合cpus: 32保证单节点 CPU 充足vLLM 调度与数据并行需要use_spot: True优先选用 Spot可抢占实例以大幅降低成本若你的工作负载不可容忍中断部署时加--no-use-spot即可disk_size: 512与disk_tier: best确保模型检查点70B 权重约 140GB能放下且 IO 性能充足ports: 8081声明对外暴露的服务端口SkyPilot 会负责在云安全组或 Kubernetes 上开放它。环境准备setupsetup: | conda activate vllm if [ $? -ne 0 ]; then conda create -n vllm python3.10 -y conda activate vllm fi pip install vllm0.4.2 # Install Gradio for web UI. pip install gradio openai pip install flash-attn2.5.9.post1setup段在每次实例初始化时执行优先激活已存在的vllmconda 环境不存在则用 Python 3.10 创建随后固定安装vllm0.4.2与当时 vLLM 的 API 签名匹配版本锁定保证可复现性、Gradio 与 OpenAI 客户端以及flash-attn2.5.9.post1加速注意力计算。启动命令runrun: | conda activate vllm echo Starting vllm api server... # https://github.com/vllm-project/vllm/issues/3098 export PATH$PATH:/sbin # NOTE: --gpu-memory-utilization 0.95 needed for 4-GPU nodes. python -u -m vllm.entrypoints.openai.api_server \ --port 8081 \ --model $MODEL_NAME \ --trust-remote-code --tensor-parallel-size $SKYPILOT_NUM_GPUS_PER_NODE \ --gpu-memory-utilization 0.95 \ --max-num-seqs 64 \ 21 | tee api_server.log while ! cat api_server.log | grep -q Uvicorn running on; do echo Waiting for vllm api server to start... sleep 5 done echo Starting gradio server... git clone https://github.com/vllm-project/vllm.git || true python vllm/examples/gradio_openai_chatbot_webserver.py \ -m $MODEL_NAME \ --port 8811 \ --model-url http://localhost:8081/v1 \ --stop-token-ids 128009,128001几个关键实现细节--tensor-parallel-size $SKYPILOT_NUM_GPUS_PER_NODESKYPILOT_NUM_GPUS_PER_NODE是 SkyPilot 自动注入的环境变量取值为本节点实际拥有的 GPU 数量。源码位于 sky/backends/task_codegen.py在任务代码生成阶段由num_gpus计算并写入环境变量字典。这意味着无论最终优化器选中的是 2 卡、4 卡还是 8 卡实例vLLM 的张量并行度都会自动对齐无需手工修改--gpu-memory-utilization 0.95将 GPU 显存利用率上限设到 95%注释特别提醒 4 卡节点需要该参数才能装下模型export PATH$PATH:/sbin规避 vLLM 在部分镜像上找不到ifconfig的问题对应上游 issue 3098后台启动 vLLM 后通过轮询日志中的Uvicorn running on判断 API 服务已就绪再启动 Gradio 聊天 UI端口 8811指向本地 8081 的 OpenAI 兼容端点--stop-token-ids 128009,128001把 Llama 3 的|eot_id|128009与|end_of_text|128001作为停止 token确保回复在正确的边界结束。单实例部署一条命令拉起 Llama 3 服务确认 YAML 无误后在仓库根目录执行HF_TOKENxxx sky launch llama3.yaml -c llama3 --secret HF_TOKEN其中-c llama3为集群命名--secret HF_TOKEN把令牌注入到secrets段。命令发出后SkyPilot 优化器会输出一份跨云比价结果并自动选择最便宜的满足条件的实例例如 Optimizer Target: minimizing cost Estimated cost: $1.2 / hour ... CLOUD INSTANCE vCPUs Mem(GB) ACCELERATORS REGION/ZONE COST ($) CHOSEN Azure Standard_NC48ads_A100_v4[Spot] 48 440 A100-80GB:2 eastus 1.22 ✔ AWS g6.48xlarge[Spot] 192 768 L4:8 us-east-1b 1.43 Azure Standard_NC96ads_A100_v4[Spot] 96 880 A100-80GB:4 eastus 2.44 GCP g2-standard-96[Spot] 96 384 L4:8 asia-east1-a 2.49 ...可以看到同一份资源声明被映射到了 Azure、AWS、GCP 等多个云的多款机型SkyPilot 依据“最小化成本”目标自动勾选了最优项。在 Kubernetes 或使用按需实例若你的 GPU 来自 Kubernetes 集群或不愿使用 Spot 实例追加--no-use-spot即可HF_TOKENxxx sky launch llama3.yaml -c llama3 --secret HF_TOKEN --no-use-spot此时优化器输出中会出现Kubernetes 32CPU--512GB--8A100这类本地 K8s 资源条目以及 Fluidstack、Paperspace 等更多来源的按需机型同样自动完成选择。等待模型就绪70B 权重下载与模型加载通常需要 10 分钟以上日志中出现以下关键行即代表服务可用(task, pid17433) INFO: Uvicorn running on http://0.0.0.0:8081 (Press CTRLC to quit) (task, pid17433) Running on local URL: http://127.0.0.1:8811 (task, pid17433) Running on public URL: https://xxxxxxxxxx.gradio.liveUvicorn running表示 vLLM 的 OpenAI API 已就绪gradio.live公共链接表示 Gradio UI 已上线。通过 OpenAI 兼容 API 与 Gradio UI 使用模型部署完成后有两种使用方式。方式一OpenAI 兼容 APIvLLM 提供标准 OpenAPI 兼容端点如/v1/chat/completions。先用sky status获取对外端点ENDPOINT$(sky status --endpoint 8081 llama3)然后直接 curl注意手动带上stop_token_ids保证模型在|eot_id|处结束curl http://$ENDPOINT/v1/chat/completions \ -H Content-Type: application/json \ -d { model: meta-llama/Meta-Llama-3-70B-Instruct, messages: [ { role: system, content: You are a helpful assistant. }, { role: user, content: Who are you? } ], stop_token_ids: [128009, 128001] }方式二Gradio UI直接打开日志中打印的https://xxxxxxxxxx.gradio.live公共链接即可与模型对话。停止与销毁资源暂停实例保留磁盘与状态可后续sky start恢复sky stop llama3彻底释放所有资源删机删盘按量计费归零sky down llama3若要尝试 8B 模型只需把 YAML 中resources.accelerators换成更便宜的候选集{L4, A10g, A10, L40, A40, A100, A100-80GB}即可在单卡上运行。用 SkyServe 横向扩展多副本、负载均衡与自动恢复在单实例验证通过后无需改动任何 YAML 即可升级为全托管服务HF_TOKENxxx sky serve up llama3.yaml -n llama3 --secret HF_TOKEN-n llama3指定服务名SkyServe 会按service.replicas: 2起 2 个副本并在控制面维护它们的健康状态。轮询服务状态watch -n10 sky serve status llama3READY 后输出形如Services NAME VERSION UPTIME STATUS REPLICAS ENDPOINT llama3 1 35s READY 2/2 xx.yy.zz.100:30001 Service Replicas SERVICE_NAME ID VERSION IP LAUNCHED RESOURCES STATUS REGION llama3 1 1 xx.yy.zz.121 18 mins ago 1x GCP([Spot]{A100-80GB: 4}) READY us-east4 llama3 2 1 xx.yy.zz.245 18 mins ago 1x GCP([Spot]{A100-80GB: 4}) READY us-east4获取一个负载均衡到所有副本的统一端点ENDPOINT$(sky serve status --endpoint llama3)调用时端点已自动做负载均衡curl -L $ENDPOINT/v1/chat/completions \ -H Content-Type: application/json \ -d { model: meta-llama/Meta-Llama-3-70B-Instruct, messages: [ { role: system, content: You are a helpful assistant. }, { role: user, content: Who are you? } ] }关键收益SkyServe 全权管理副本生命周期——若某个 Spot 副本被云厂商抢占控制面会自动拉起新副本替换显著降低运维负担的同时保留 Spot 价格优势。副本之间还可以来自不同的云或不同的购买方式预留实例 Spot 混合进一步压低成本。相关机制详见 sky/serve 目录的源码实现与测试。释放服务sky serve down llama3可选把 GUI 与后端服务解耦如果想给 Llama 3 服务配一个独立的前端 GUI例如前端单副本、后端多副本仓库提供了现成的 llm/llama-3/gui.yaml它只要求 2 核 CPU通过--env ENDPOINT指向后端端点sky launch -c llama3-gui ./gui.yaml --env ENDPOINT$(sky serve status --endpoint llama3)启动后日志会打印 Gradio 公共链接| INFO | stdout | Running on public URL: https://6141e84201ce0bb4ed.gradio.live打开该链接即可通过 GUI 对话请求会在后端的多个 Llama 3 副本间负载均衡。该 YAML 同样支持--env ENDPOINT$(sky status --endpoint 8081 llama3)指向单实例部署两种模式通用。延伸Llama 3 微调与系列模型微调仓库提供了 Llama 2 微调教程可直接迁移适配 Llama 3相关流程与配置可参考仓库 llm/llama-3_1/README.md 及 docs 目录下的微调相关文档Llama 3.1同目录族下还提供了 llm/llama-3_1 的部署配方覆盖 8B / 70B / 405B-FP8 三档模型并给出了 GPU 兼容矩阵与sky local up本地 GPU 工作站 / K8s / 云三种基础设施的接入方式其 YAML 与本文配方结构一致仅将 vLLM 升级到0.5.3post1并使用vllm serve新命令同时将disk_size提升到 1000 以容纳 405B 权重。L4:1 即可服务 8B 模型需配合--max-model-len 4096。小结通过这份配方你可以把 Llama 3以及同族的 Llama 3.1完整地跑在自己名下的任何云或 Kubernetes 上sky launch一条命令单机起步sky serve up零改动升级为多副本高可用服务sky status --endpoint获得统一访问入口sky stop / sky down / sky serve down随时控制成本。所有关键行为——跨云比价、GPU 数量自动注入、就绪探测、副本自愈——都有仓库源码与 llm/llama-3/llama3.yaml 配置一一对应是一套可直接复制、可审计、可复现的私有化 LLM 服务方案。【免费下载链接】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),仅供参考
返回列表