ARTICLE DETAIL

资讯详情

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

SkyPilot 上部署 Gemma 开源模型:从单实例 vLLM 服务到 SkyServe 多副本弹性扩容

SkyPilot 上部署 Gemma 开源模型:从单实例 vLLM 服务到 SkyServe 多副本弹性扩容 SkyPilot 上部署 Gemma 开源模型从单实例 vLLM 服务到 SkyServe 多副本弹性扩容【免费下载链接】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/gemma/README.md 展开完整演示如何将 Google 开源的 Gemma 系列模型以google/gemma-7b-it为例托管到任意云上先通过一条sky launch命令在单实例上以 vLLM 提供 OpenAI 兼容的 Completion 与 Chat API再借助 SkyServe 将同一个 YAML 无改动升级为跨实例、跨区域、跨云的多副本弹性服务并获得统一入口与健康检查。读完本文你将掌握 Gemma 等开源 LLM 在 SkyPilot 上的完整部署链路、配套 serve.yaml 的逐项配置语义以及底层实现原理。一、背景开源版 Gemini 的模型服务诉求Google 发布的 Gemma 系列是 Gemini 模型的开放权重版本一经推出即在 AI 社区引发强烈反响为开源社区提供了私有化 Gemini的服务与微调可能性。要将其真正投入生产通常需要解决两个问题在任意云上快速拉起一个带 GPU 的推理服务暴露 OpenAI 兼容的 HTTP API流量上来后能横向扩容且不改变客户端调用方式。SkyPilot 的定位是面向前沿 AI 团队的算力平台其核心能力正是把碎片化的多云算力抽象为统一资源池。Gemma 示例恰好是这一能力的最小化、可复现演示同一份 serve.yaml 即可覆盖单实例部署与SkyServe 弹性服务两种形态。二、前置准备2.1 申请 Gemma 模型访问权Gemma 权重托管在 Hugging Face 上属于需授权的 gated 模型。首先访问google/gemma-7b模型主页点击Acknowledge license按钮接受许可协议即可获得模型权重的访问资格。2.2 生成 Hugging Face 只读访问令牌在 Hugging Face 的 token 设置页生成一个只读访问令牌Read token并确保当前账号可以访问google/gemma-7b等受控模型。该令牌将在后续启动命令中以HF_TOKEN环境变量注入集群。2.3 安装 SkyPilotpip install skypilot-nightly[all]其中[all]会同时安装所有主流云提供商的依赖AWS、GCP、Azure 等便于在多云之间自由选择。详细安装步骤可参考仓库内文档 docs/getting-started/installation.rst。安装完成后需按所选云服务商完成相应的账号与密钥配置sky check可验证各云的可用性。三、单实例部署一条命令拉起 Gemma 推理服务3.1 启动命令HF_TOKENxxx sky launch -c gemma serve.yaml --secret HF_TOKEN各参数含义如下HF_TOKENxxx在本地 shell 中临时定义环境变量值-c gemma为创建的集群命名cluster name 为gemmaserve.yaml指向 llm/gemma/serve.yaml 的任务描述文件--secret HF_TOKEN将本地环境变量HF_TOKEN以密钥方式安全地注入到远端集群而非明文写入 YAML 或命令日志。sky launch会自动完成以下动作寻找满足accelerators列表任一 GPU 的实例、自动开通 8000 端口、执行setup段初始化环境创建 conda 环境并安装 vLLM 等依赖、随后在远端执行run段启动 vLLM OpenAI API Server。集群空闲时可通过sky down gemma释放资源。3.2 验证服务Completion API服务启动后先通过sky status --ip获取集群公网 IP再以 curl 调用 OpenAI 兼容的补全接口IP$(sky status --ip gemma) curl http://$IP:8000/v1/completions \ -H Content-Type: application/json \ -d { model: google/gemma-7b-it, prompt: My favourite condiment is, max_tokens: 25 } | jq .model字段对应MODEL_NAME环境变量google/gemma-7b-it即指令微调版本max_tokens控制生成长度。3.3 验证服务Chat APIGemma 的指令微调版本同样支持多轮对话格式IP$(sky status --ip gemma) curl http://$IP:8000/v1/chat/completions \ -H Content-Type: application/json \ -d { model: google/gemma-7b-it, messages: [ { role: user, content: Hello! What is your name? } ], max_tokens: 25 }四、理解 serve.yaml单 YAML 的全要素配置serve.yaml 之所以能同时服务单实例与SkyServe两种模式是因为它同时包含了resources任务资源与service服务规格两个层级。下面逐段拆解。4.1 envs 与 secrets敏感信息的声明式注入envs: MODEL_NAME: google/gemma-7b-it secrets: HF_TOKEN: null # Pass with --secret HF_TOKEN in CLIenvs.MODEL_NAME声明模型名供 readiness probe 与run段共同引用secrets.HF_TOKEN: null声明一个待注入的密钥占位符值由命令行的--secret HF_TOKEN提供。从 schema 定义看见 sky/utils/schemas.pysecrets字段支持两种形态{NAME: value}的字典形式内联密钥或占位以及字符串数组形式仅托管密钥引用。这种设计避免把 Hugging Face 令牌明文写进仓库或日志。4.2 resourcesGPU 与端口声明resources: accelerators: {L4, A10g, A10, L40, A40, A100, A100-80GB} ports: 8000 disk_tier: bestaccelerators给出一个候选 GPU 列表SkyPilot 会按可用性与价格自动挑选其一从而在 AWS、GCP、Azure 等任意云上完成调度ports: 8000声明任务对外监听端口SkyPilot 会自动配置安全组/防火墙规则disk_tier: best请求高性能本地 SSD如 NVMe用于加速模型权重加载。4.3 setup 与 run环境初始化与 vLLM 启动setup: | conda activate gemma if [ $? -ne 0 ]; then conda create -n gemma -y python3.10 conda activate gemma fi pip install vllm0.3.2 pip install transformers4.38.1 python -c import huggingface_hub; huggingface_hub.login(${HF_TOKEN}) run: | conda activate gemma export PATH$PATH:/sbin # --max-model-len is set to 1024 to avoid taking too much GPU memory on L4 and # A10g with small memory. python -u -m vllm.entrypoints.openai.api_server \ --host 0.0.0.0 \ --model $MODEL_NAME \ --tensor-parallel-size $SKYPILOT_NUM_GPUS_PER_NODE \ --max-model-len 1024 | tee ~/openai_api_server.log关键点setup 段优先复用已存在的gemmaconda 环境否则创建 Python 3.10 环境随后固定安装vllm0.3.2与transformers4.38.1版本锁定保证可复现最后用注入的HF_TOKEN执行huggingface_hub.login使 vLLM 在拉取 gated 权重时具备授权。run 段以python -m vllm.entrypoints.openai.api_server启动 OpenAI 兼容服务。--tensor-parallel-size $SKYPILOT_NUM_GPUS_PER_NODE这是单机多卡张量并行的关键。该变量由 SkyPilot 自动注入其生成逻辑位于 sky/backends/task_codegen.py常量定义于 sky/skylet/constants.py。它精确等于本节点实际分配的 GPU 数量因此示例 YAML 无需硬编码并行度未来若把accelerators改为单机多卡如A100:8run段无需任何修改即可启用 8 卡张量并行。--max-model-len 1024注释明确说明该值被刻意压低到 1024以避免在显存较小的 L4、A10g 上因 KV Cache 占用过大而 OOM。4.4 service 段SkyServe 服务规格service: readiness_probe: path: /v1/chat/completions post_data: model: $MODEL_NAME messages: - role: user content: Hello! What is your name? max_tokens: 1 initial_delay_seconds: 1200 replicas: 2service段仅在 SkyServe 模式下生效其解析入口为 sky/serve/service_spec.pyreadiness_probeSkyServe 控制器周期性探测副本健康状态的依据。示例采用POST 真实请求/v1/chat/completions加一段真实的post_data相比普通 GET 探活更能反映 LLM 服务的真实可用性——这是处理 LLM 服务33B、70B 等大模型首次加载权重极慢时的关键实践。当未配置post_data时探针退化为GET path见 service_spec.py。initial_delay_seconds: 1200副本启动后的一段宽限期期间探针失败会被忽略。默认值为 1200 秒见 sky/serve/constants.py专门为大模型下载权重、冷启动推理引擎预留时间。replicas: 2固定副本数。SkyServe 同时支持replica_policy含min_replicas/max_replicas/target_qps_per_replica的 QPS 自动扩缩容等更高级配置且两者不可同时指定service_spec.py。五、SkyServe 弹性扩容同一个 YAML零改动上生产5.1 启动命令HF_TOKENxxx sky serve up -n gemma serve.yaml --secret HF_TOKEN唯一的区别是把sky launch换成sky serve up。SkyServe 会启动一个轻量控制器集群默认 4 CPU / 8GB 内存见 sky/serve/constants.py按replicas: 2在可能不同的云、区域上拉起两个副本实例通过 readiness probe 确认各副本就绪后将流量统一导向一个稳定的负载均衡端点自动处理副本故障重启与滚动更新。5.2 通过统一端点访问ENDPOINT$(sky serve status --endpoint gemma) curl http://$ENDPOINT/v1/completions \ -H Content-Type: application/json \ -d { model: google/gemma-7b-it, prompt: My favourite condiment is, max_tokens: 25 } | jq .Chat API 同样可用curl http://$ENDPOINT/v1/chat/completions \ -H Content-Type: application/json \ -d { model: google/gemma-7b-it, messages: [ { role: user, content: Hello! What is your name? } ], max_tokens: 25 }sky serve status --endpoint gemma返回的是 SkyServe 负载均衡器的公网地址客户端无需关心流量被路由到哪一个副本也无需区分副本位于哪个云。这与单实例场景sky status --ip的使用方式保持了一致的心智模型。若要查看每个副本的运行状态可使用sky serve status gemma。六、从源码看 Gemma 示例的可靠性设计6.1 探活超时与负载均衡重试LLM 推理单次生成可能耗时数十秒SkyServe 为此内置了面向 LLM 场景的默认值sky/serve/constants.py默认探活超时 15 秒注释明确指出因为用真实生成请求做 readiness probe 对 LLM 服务非常耗时该默认值专为大模型场景设计负载均衡流式超时 120 秒足以覆盖 Llama2-70B 等大模型单请求处理时长端点探测间隔 10 秒控制器每 10 秒同步一次副本健康状态。这些默认值保证了真实生成请求型探针不会因首 token 延迟而误判副本不可用。6.2 就绪探针的真实请求语义从 service_spec.py 的probe_str()可以看出探针最终会被编码为POST /v1/chat/completions {json}。也就是说SkyServe 会向副本发送一条真实的、max_tokens: 1的极短对话请求——模型必须真正完成一次前向推理才算就绪。这正是大模型服务健康检查的最严格形态权重加载完成、推理引擎可用、端口可达三者同时满足。6.3 横向扩展路径同族模型的复用仓库中的 llm/gemma3/gemma3.yaml 展示了同族模型在 SkyServe 上的进阶用法通过replica_policy.min_replicas/max_replicas与target_qps_per_replica: 5实现按 QPS 自动扩缩容并把HF_TOKEN直接写入envs结合托管密钥使用。这证明 Gemma 系列在 SkyPilot 上既支持固定副本的确定性部署也支持基于负载的弹性伸缩且骨架与 serve.yaml 高度一致。七、总结与排障提示核心结论部署形态命令访问方式适用场景单实例sky launch -c gemma serve.yaml --secret HF_TOKENhttp://IP:8000快速验证、开发调试弹性服务sky serve up -n gemma serve.yaml --secret HF_TOKENhttp://ENDPOINT生产多副本、多云容灾常见问题排查模型权重下载失败确认已在 Hugging Face 完成 License 勾选、HF_TOKEN为只读令牌且有google/gemma-7b-it访问权探针迟迟不就绪大模型冷启动需要下载权重并加载进显存initial_delay_seconds: 1200即为此预留若 GPU 显存不足导致 OOM可进一步降低--max-model-len端口不通确认 YAML 中ports: 8000已声明SkyPilot 会据此自动放通防火墙/安全组多卡显存不足若希望单机多卡张量并行只需把accelerators改为A100:8这类带数量的写法--tensor-parallel-size会由 SkyPilot 自动按实际 GPU 数注入。至此你已经掌握了从零配置单实例起服务到SkyServe 多副本统一入口的完整 Gemma 部署方案且同一份 serve.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),仅供参考
返回列表