
使用 SkyPilot 部署私有 Code LlamaOpenAI 兼容 API、Chat 与 VSCode 助手一站式方案【免费下载链接】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/skypilotCode Llama 是 Meta 在 Llama 2 基础上、使用代码专属数据集进一步训练得到的代码大模型其 70B 版本于 2024 年 1 月发布。本文围绕仓库 llm/codellama/ 下的完整示例讲解如何用 SkyPilot 以一键方式把 Code Llama 70B 部署成 vLLM 托管的 OpenAI 兼容服务再借助 SkyServe 跨云扩副本并提供 Chat API、FastChat GUI 与 Tabby VSCode 助手三种接入方式。读完本文你将掌握从启动模型、弹性扩容到多端接入的完整实战链路并理解其中关键配置项在源码层面的作用。Code Llama 与 SkyPilot 的组合价值Code Llama 是代码领域特化的 Llama 2 变体通过在代码数据集上进一步训练而生2024 年 1 月 29 日 Meta 发布了 Code Llama 家族中规模最大、表现最好的 70B 版本。本文演示的正是由 SkyPilot ServeSkyServe托管的 Code Llama 70B 服务示例位于 llm/codellama/兼容 vLLM 的 OpenAI 接口。相比购买商业托管方案用 SkyPilot 自建 Code Llama 服务有几点核心优势跨区域、跨云的高可用通过利用多个区域和云厂商的多资源池最大化 GPU 可用性示例中 2 个副本可以一个落在 Azure、一个落在 GCP。成本最低化SkyPilot 会自动在区域和云之间挑选最便宜的资源没有托管方案的加价markup。单端点水平扩展可将服务扩展到多个不同位置、不同加速器的副本所有副本由一个统一端点对外提供。数据留在自己的云账户一切VM 与存储桶都运行在你的云账户内。完全私有没有人能看见你的聊天记录。环境准备与示例文件总览开始前需先安装 SkyPilot。本仓库示例目录 llm/codellama/ 包含 5 个文件文件作用endpoint.yaml启动 vLLM 托管的 Code Llama 70B OpenAI 兼容 API 服务可配合sky launch单实例运行或配合sky serve up多副本运行complete.py用 OpenAI Python SDK 调用服务的客户端脚本gui.yaml启动 FastChat 的 Gradio Web UI作为聊天界面tabby.yaml启动 Tabby 服务供 VSCode Tabby 扩展接入做编码助手README.md本文所依据的官方使用说明其中endpoint.yaml是整条链路的核心同时被sky launch与sky serve up复用gui.yaml与tabby.yaml都通过环境变量ENDPOINT指向已运行的 API 服务。一键启动 Code Llama 70B 推理服务单实例方式sky launch在已安装 SkyPilot 的前提下用一条命令即可启动服务sky launch -c code-llama -s endpoint.yaml-c code-llama指定集群名-s表示跳过集群身份确认直接沿用已有集群。SkyPilot 会依据 endpoint.yaml 中的资源声明跨云竞价挑选最便宜的可用实例典型输出如下---------------------------------------------------------------------------------------------------------- CLOUD INSTANCE vCPUs Mem(GB) ACCELERATORS REGION/ZONE COST ($) CHOSEN ---------------------------------------------------------------------------------------------------------- Azure Standard_NC48ads_A100_v4 48 440 A100-80GB:2 eastus 7.35 ✔ GCP g2-standard-96 96 384 L4:8 us-east4-a 7.98 GCP a2-ultragpu-2g 24 340 A100-80GB:2 us-central1-a 10.06 Azure Standard_NC96ads_A100_v4 96 880 A100-80GB:4 eastus 14.69 GCP a2-highgpu-4g 48 340 A100:4 us-central1-a 14.69 AWS g5.48xlarge 192 768 A10G:8 us-east-1 16.29 GCP a2-ultragpu-4g 48 680 A100-80GB:4 us-central1-a 20.11 Azure Standard_ND96asr_v4 96 900 A100:8 eastus 27.20 GCP a2-highgpu-8g 96 680 A100:8 us-central1-a 29.39 AWS p4d.24xlarge 96 1152 A100:8 us-east-1 32.77 Azure Standard_ND96amsr_A100_v4 96 1924 A100-80GB:8 eastus 32.77 GCP a2-ultragpu-8g 96 1360 A100-80GB:8 us-central1-a 40.22 AWS p4de.24xlarge 96 1152 A100-80GB:8 us-east-1 40.97 ---------------------------------------------------------------------------------------------------------- Launching a cluster code-llama. Proceed? [Y/n]:表中展示了跨 Azure、GCP、AWS 三个云的候选实例最终选中 Azure 上最便宜的Standard_NC48ads_A100_v4A100-80GB:2。SKYPILOT 还会要求确认[Y/n]后继续创建集群。资源声明详解endpoint.yaml 的resources段决定了能调度到的硬件resources: accelerators: {L4:8, A10g:8, A10:8, A100:4, A100:8, A100-80GB:2, A100-80GB:4, A100-80GB:8} disk_size: 1024 disk_tier: best memory: 32 ports: 8000accelerators允许的 GPU 集合覆盖从 8 卡 L4、A10G、A10 到 2/4/8 卡 A100、A100-80GB 的多种组合供优化器按价格挑最低者70B 模型需要多卡显存示例即以 8×L4 或 2×A100-80GB 等配置起步。disk_size: 1024与disk_tier: best预留 1TB 高性能磁盘用于存放模型权重。memory: 32要求实例内存不低于 32GB。ports: 8000开放 8000 端口供 vLLM API 对外监听。setup段创建并激活名为codellama的 conda 环境固定安装transformers4.38.0与vllm0.3.2run段启动 vLLM OpenAI 服务器python -u -m vllm.entrypoints.openai.api_server \ --host 0.0.0.0 \ --model codellama/CodeLlama-70b-Instruct-hf \ --tensor-parallel-size $SKYPILOT_NUM_GPUS_PER_NODE \ --max-num-seqs 64 | tee ~/openai_api_server.log关键参数--tensor-parallel-size使用 SkyPilot 自动注入的环境变量SKYPILOT_NUM_GPUS_PER_NODE即本节点 GPU 数使张量并行度自动匹配所选实例--max-num-seqs 64用于在 L4:8 等显存较紧张的机型上加载模型时避免 OOM--host 0.0.0.0允许从外部访问。调用补全接口启动完成后拿到集群 IP 并发送补全请求IP$(sky status --ip code-llama) curl http://$IP:8000/v1/completions \ -H Content-Type: application/json \ -d { model: codellama/CodeLlama-70b-Instruct-hf, prompt: def quick_sort(a: List[int]):, max_tokens: 512 } | jq -r .choices[0].text模型返回的快速排序实现if len(a) 1: return a pivot a.pop(len(a)//2) b [] c [] for i in a: if i pivot: b.append(i) else: c.append(i) b quick_sort(b) c quick_sort(c) res [] res.extend(c) res.append(pivot) res.extend(b) return res用 SkyServe 弹性扩展为多副本服务一条命令完成扩容SkyServe 是构建在 SkyPilot 之上的服务层。将上面的sky launch换成sky serve up -n code-llama ./endpoint.yamlSkyServe 会按 endpoint.yaml 顶部的service段创建多个副本自动部署到最便宜的可用区域与加速器上并自动管理副本生命周期健康检查、按负载伸缩、异常重启。所有请求发往一个统一端点由负载均衡转发给就绪副本。service 段配置说明endpoint.yaml的service段service: readiness_probe: path: /v1/completions post_data: model: codellama/CodeLlama-70b-Instruct-hf prompt: def hello_world(): max_tokens: 1 initial_delay_seconds: 1800 replicas: 2replicas: 2固定维持 2 个副本。readiness_probe就绪探针。path指定探测的 HTTP 路径必须以/开头见 service_spec.py 的校验逻辑post_data携带一次最小化的补全请求max_tokens: 1用于验证模型真正可用initial_delay_seconds: 1800表示副本启动后先等待 1800 秒模型下载与加载耗时较长再开始探测。从 sky/serve/constants.py 可见SkyServe 默认initial_delay_seconds为 1200、min_replicas为 1此处显式覆盖以适配 70B 模型的冷启动。更细粒度的参数如readiness_timeout_seconds、endpoint_probe_interval_seconds等由SkyServiceSpec在 service_spec.py 中统一管理例如未显式指定时DEFAULT_READINESS_PROBE_TIMEOUT_SECONDS 15、DEFAULT_ENDPOINT_PROBE_INTERVAL_SECONDS 10详见 constants.py。若同时配置target_qps_per_replica与max_replicas还可启用基于 QPS 的自动伸缩autoscaling默认 upscale 延迟为 300 秒、downscale 延迟为 1200 秒见 constants.py。查看服务状态sky serve status code-llama典型输出Services NAME VERSION UPTIME STATUS REPLICAS ENDPOINT code-llama 1 - READY 2/2 3.85.107.228:30002 Service Replicas SERVICE_NAME ID VERSION IP LAUNCHED RESOURCES STATUS REGION code-llama 1 1 - 2 mins ago 1x Azure({A100-80GB: 2}) READY eastus code-llama 2 1 - 2 mins ago 1x GCP({L4: 8}) READY us-east4-a可以看到服务由 2 个副本支撑一个在 AzureA100-80GB:2一个在 GCPL4:8加速器类型均为各自云上最便宜的可选项。这样做在最大化服务可用性的同时最小化成本。通过统一端点访问ENDPOINT$(sky serve status --endpoint code-llama) curl http://$ENDPOINT/v1/completions \ -H Content-Type: application/json \ -d { model: codellama/CodeLlama-70b-Instruct-hf, prompt: def quick_sort(a: List[int]):, max_tokens: 512 } | jq -r .choices[0].text与单实例方式唯一的区别是请求地址换成 SkyServe 统一端点其余请求体完全一致副本间路由由 SkyServe 自动完成。接入方式一OpenAI Chat APICode Llama 服务同样兼容 OpenAI 的 Chat APIENDPOINT$(sky serve status --endpoint code-llama) curl http://$ENDPOINT/v1/chat/completions \ -H Content-Type: application/json \ -d { model: codellama/CodeLlama-70b-Instruct-hf, messages: [ { role: system, content: You are a helpful and honest code assistant expert in Python. }, { role: user, content: Show me the python code for quick sorting a list of integers. } ], max_tokens: 512 } | jq -r .choices[0].message.content模型返回示例快速排序的 Python 实现与使用说明def quicksort(arr): if len(arr) 1: return arr pivot arr[len(arr) // 2] left [x for x in arr if x pivot] middle [x for x in arr if x pivot] right [x for x in arr if x pivot] return quicksort(left) middle quicksort(right) # Example usage: numbers [10, 2, 44, 15, 30, 11, 50] sorted_numbers quicksort(numbers) print(sorted_numbers)该代码以列表中间元素为 pivot将列表拆分为小于、等于、大于三部分递归排序左右分区后与中间分区合并。用 Python SDK 调用仓库提供了基于 OpenAI SDK 的客户端脚本 complete.pypython complete.py其实现要点与脚本内注释对应service_records sky.serve.status(code-llama) endpoint service_records[0][endpoint]脚本直接用 SkyPilot 的 Python SDK 查询名为code-llama的服务并取得端点再构造 OpenAI 客户端client openai.OpenAI( base_urlfhttp://{endpoint}/v1, # No API key is required when self-hosted. api_keyEMPTY)自托管服务无需真实 API Key填入EMPTY即可随后调用chat.completions.create发送系统提示Python 代码专家与用户问题max_tokens300限制输出长度最后打印完整响应。接入方式二FastChat 聊天 GUI若希望用浏览器聊天界面访问服务仓库提供了 FastChat 的 Gradio Web UI 配置 gui.yamlsky launch -c code-llama-gui ./gui.yaml --env ENDPOINT$(sky serve status --endpoint code-llama)启动后在返回的日志中寻找 Gradio 公网链接| INFO | stdout | Running on public URL: https://6141e84201ce0bb4ed.gradio.live打开该链接即可与 Code Llama 对话。gui.yaml的envs段声明了ENDPOINT即 API 服务地址resources.cpus: 2表示仅需 2 核 CPU 即可运行界面setup安装fschat[model_worker,webui]与openai1run段动态生成model_info.json描述模型与api_base然后依次启动 FastChat controller 与gradio_web_server --share。体验提示适当调高 temperature 与 top_p 通常能获得更好的生成结果。接入方式三Tabby 编码助手接入 VSCodeTabby 是开源、自托管的 AI 编码助手可将自有模型接入 VSCode 使用。仓库提供 tabby.yamlsky launch -c tabby ./tabby.yaml --env ENDPOINT$(sky serve status --endpoint code-llama)获取 Tabby 服务端点IP$(sky status --ip tabby) echo Endpoint: http://$IP:8080然后在 VSCode 中安装 Tabby 扩展在 Tabby 设置里把 API Endpoint 配置为上述地址即可开始使用。tabby.yaml中resources.ports: 8080开放了 Tabby 的监听端口setup下载 Tabby v0.8.0-rc.1 二进制run以experimental-http设备模式启动并通过 JSON 参数把模型声明为openai类型、指向http://$ENDPOINT/v1/completions./tabby serve --device experimental-http \ --model {\kind\: \openai\, \model_name\: \codellama/CodeLlama-70b-Instruct-hf\, \api_endpoint\: \http://$ENDPOINT/v1/completions\, \prompt_template\: \{prefix}\}关于补全infill能力的注意事项Code Llama 70B 不具备完整的 infill代码中间补全功能参见 HuggingFace 上codellama/CodeLlama-70b-Instruct-hf的模型卡因此 Tabby 与 Code Llama 70B 组合时补全体验可能受限。若需要 infill 能力可以使用较小的 Code Llama 模型如 7B/13B Instruct 版本并将 tabby.yaml 中prompt_template改为fim▁begin{prefix}fim▁end{suffix}fim▁end。追求更佳体验时可参考 Tabby 官方文档推荐的模型以及本仓库的 llm/tabby 示例。两种部署模式的对比与选择维度sky launch -c code-llama -s endpoint.yamlsky serve up -n code-llama ./endpoint.yaml副本数单实例按service.replicas多副本端点集群 IP 端口 8000SkyServe 统一端点自动负载均衡可用性单点跨云多副本自动健康检查与重启成本单个最便宜实例多个最便宜实例之和按需伸缩可更低适用场景快速验证、个人使用生产服务、多人/多端接入两者的推理负载声明、setup 与 run 完全一致切换成本极低先sky launch验证模型与请求再改用sky serve up平滑升级为多副本生产服务。小结本文完整走通了“私有 Code Llama”的部署链路用 endpoint.yaml 通过 vLLM 启动 Code Llama 70B 的 OpenAI 兼容服务用sky serve up跨云扩展为多副本并统一管理随后分别通过 Chat API含 complete.py 的 SDK 调用、FastChat GUIgui.yaml与 Tabby VSCode 助手tabby.yaml三种方式接入模型。所有计算资源都运行在自己的云账户中数据保持私有且按 SkyPilot 的优化器自动选取各云上最便宜的可用实例实现了可用性、成本与数据隐私的兼顾。【免费下载链接】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),仅供参考