ARTICLE DETAIL

资讯详情

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

使用 SkyPilot 部署 LoRAX:单 GPU 托管数千个微调 LLM 的多适配器推理服务器

使用 SkyPilot 部署 LoRAX:单 GPU 托管数千个微调 LLM 的多适配器推理服务器 使用 SkyPilot 部署 LoRAX单 GPU 托管数千个微调 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/skypilotLoRAXLoRA eXchange是一种多 LoRA 推理服务器框架它允许用户在一块 GPU 上同时服务数千个微调后的 LLM通过在运行时将多个微调适配器如 LoRA动态加载到单个基础模型之上并让来自不同适配器的并发请求在同一个批次中共同处理从而在吞吐与延迟基本不受损的前提下大幅降低推理服务成本。本文将基于 SkyPilot 仓库中的官方示例llm/lorax/README.md 与 llm/lorax/lorax.yaml完整讲解从编写 YAML 配置、一键拉起实例到通过 REST API 分别对基础模型与 LoRA 适配器发起推理请求再到停止、删除集群的全过程。读完后你将具备一套可直接复制的单卡多模型LLM 服务实战方案并能理解 LoRAX 与 SkyPilot 资源调度、端口开放、持久化存储之间的配合原理。LoRAX 核心机制为什么能在单卡上服务上千个模型传统做法下每一个微调后的模型都需要独立占满 GPU 显存部署一套推理服务N 个微调模型就意味着 N 份显存开销。LoRAX 的思路则完全不同它只加载一份基础模型base model权重到 GPU微调产生的 LoRA 适配器权重通常只有几十 MB 到几百 MB则按需动态加载、随时替换。关键的设计亮点在于同批次混跑并发请求即使指向不同的适配器也可以被打包进同一个 batch 在前向计算中并行处理因此随着适配器数量增长吞吐量能维持近线性的扩展而不是线性恶化。这正是LoRA eXchange名称的由来——GPU 上的适配器可以被高效地交换与复用。前置准备SkyPilot 安装与云端凭证检查在启动任何部署之前请确认本机已安装 SkyPilot 且已配置目标云厂商如 AWS的凭证。仓库中其他 LLM 服务示例如 llm/vllm/README.md给出了标准的准备流程pip install githttps://github.com/skypilot-org/skypilot.git sky checksky check会逐一探测各云厂商的凭证有效性。只有通过了检查的云本示例默认面向 AWS 的 A10G 等实例才能被 SkyPilot 调度。启动部署编写 lorax.yaml 并一键拉起在 llm/lorax/lorax.yaml 中官方给出了完整的部署配置。你可以照抄为本地lorax.yamlresources: accelerators: {A10G, A10, L4, A100, A100-80GB} memory: 32 ports: - 8080 envs: MODEL_ID: mistralai/Mistral-7B-Instruct-v0.1 run: | docker run --gpus all --shm-size 1g -p 8080:80 -v ~/data:/data \ ghcr.io/predibase/lorax:latest \ --model-id $MODEL_ID逐项拆解这段配置resources.accelerators: {A10G, A10, L4, A100, A100-80GB}以集合形式声明可接受的 GPU 类型。SkyPilot 会按照可用性与价格在集合中挑选其一进行供应。上述型号均为 24GB 或 80GB 显存的 NVIDIA GPU足以承载 7B 量级基础模型加若干适配器。若你需要运行更大的基础模型可扩展此列表。resources.memory: 32要求实例至少有 32GB 内存防止模型加载与适配器缓存导致 OOM。resources.ports: [8080]声明需要对外开放的端口。在 sky/resources.py 中可以看到SkyPilot 会在构造Resources时对端口列表做规范化与校验支持整数、字符串、列表、范围表达式等并在云上安全组 / 防火墙中自动开放这些端口供后续curl访问。此处的 8080 对应下方docker run -p 8080:80暴露到宿主机上的端口。envs.MODEL_ID传递给运行脚本的环境变量默认值为mistralai/Mistral-7B-Instruct-v0.1。run节点就绪后执行的启动脚本。docker run --gpus all启用全部 GPU--shm-size 1g扩大共享内存Transformer 推理对共享内存有较高需求-p 8080:80将容器内 LoRAX 服务端口 80 映射到宿主机的 8080-v ~/data:/data将宿主机的~/data目录挂载进容器用于持久化缓存ghcr.io/predibase/lorax:latest是官方预构建的 LoRAX Docker 镜像最后通过--model-id $MODEL_ID指定基础模型。之后执行启动命令sky launch -c lorax-cluster lorax.yaml-c lorax-cluster为集群命名。SkyPilot 会先挑选符合资源约束的实例完成供应再在实例上运行run脚本拉起容器。默认部署的是Mistral-7B-Instruct如需换模型无需修改文件直接用--env覆盖即可sky launch -c lorax-cluster lorax.yaml --env MODEL_IDmy_model安全提示上述配置默认将实例暴露在公网 IP 上。生产环境强烈建议将实例放入私有子网VPC并配置私有 IP 访问关于如何开启 VPC 与私有 IP 的相关选项可查阅 SkyPilot 的 Advanced Configurations 章节。对基础模型发起推理REST API 调用部署完成后在另一个终端窗口获取集群的 IP 地址sky status --ip lorax-clustersky status --ip是仓库中多个示例通用的取 IP 方式例如 examples/cog/README.md 中的IP$(sky status --ip cog)用法完全一致也可将其赋值给变量后直接拼接请求IP$(sky status --ip lorax-cluster) curl http://$IP:8080/generate \ -X POST \ -d { inputs: [INST] Natalia sold clips to 48 of her friends in April, and then she sold half as many clips in May. How many clips did Natalia sell altogether in April and May? [/INST], parameters: { max_new_tokens: 64 } } \ -H Content-Type: application/jsonLoRAX 的/generate端点采用与 Hugging Face TGI 一致的请求协议inputs是提示文本parameters.max_new_tokens限制生成的最大 token 数。仓库中 llm/tgi/serve.yaml 对应的示例也使用了同样的请求体格式因此掌握了这一套协议即可在 LoRAX、TGI 等同类推理服务器之间平滑迁移。使用 LoRA 适配器推理一行参数提升专业能力在/generate的请求参数中增加一个adapter_id字段指向 HuggingFace Hub 上任意有效的 LoRA 适配器即可在不重启服务、不换基础模型的情况下切换技能。官方示例使用vineetsharma/qlora-adapter-Mistral-7B-Instruct-v0.1-gsm8k——这是一个针对数学推理GSM8K微调过的适配器用于对比验证适配器对回答质量的提升curl http://$IP:8080/generate \ -X POST \ -d { inputs: [INST] Natalia sold clips to 48 of her friends in April, and then she sold half as many clips in May. How many clips did Natalia sell altogether in April and May? [/INST], parameters: { max_new_tokens: 64, adapter_id: vineetsharma/qlora-adapter-Mistral-7B-Instruct-v0.1-gsm8k } } \ -H Content-Type: application/json对同一个数学应用题接入 GSM8K 适配器后LoRAX 会在推理阶段动态加载该 LoRA 权重叠加到基础模型上显著提升数学推理的准确率。除了这个示例官方还列举了几个值得尝试的 Mistral-7B 微调适配器alignment-handbook/zephyr-7b-dpo-lora基于 Zephyr-7B 数据集用 DPO 微调适合对齐风格任务IlyaGusev/saiga_mistral_7b_lora基于 Open-Orca/Mistral-7B-OpenOrca 的俄语聊天模型Undi95/Mistral-7B-roleplay_alpaca-lora用角色扮演提示微调适合角色对话场景。HuggingFace Hub 上还有大量按pipeline_tagtext-generation分类的 LoRA 适配器可供挑选若想自产适配器可使用 PEFT 或 Ludwig 对基础模型做微调再把产物推送到 Hub 即可被 LoRAX 动态引用。由于 LoRAX 会缓存已加载的适配器多个不同适配器的请求在同一批内混合处理这正是其相比一模型一部署成本优势的根本来源。停止部署释放算力、保留数据当暂时不需要推理服务时执行sky stop lorax-clustersky stop会关闭云上的实例停止计费但保留磁盘卷。由于配置中使用了-v ~/data:/data的卷挂载之前下载的模型权重、适配器以及 LoRAX Docker 镜像都缓存在宿主机磁盘上下一次sky launch时会被直接复用无需重新下载。一个需要留意的细节缓存复用也意味着镜像不会自动更新。由于 Docker 镜像已存在于本地latest标签在重启后不会拉取新版本。如果你希望每次启动都获取最新镜像需要在run脚本开头显式加入docker pull命令。删除部署彻底释放资源当不再需要这套部署包括其存储卷时执行sky down lorax-cluster与sky stop不同sky down会连同实例和持久化卷一并删除云端资源被彻底释放。下次再sky launch时部署将从零开始重建。这是两种操作的核心区别stop面向暂时关机、快速恢复down面向彻底清理。源码视角端口校验与资源调度的实现依据从实现层面可以进一步印证上述配置的底层行为端口声明与校验ports字段最终进入 sky/resources.py 中Resources构造逻辑支持整数、字符串、列表及逗号/短横线分隔的范围表达式如8000-8100会被扁平化后调用simplify_ports归一化并在 sky/resources.py 的_try_validate_ports中做合法性校验。这解释了为何 YAML 中写ports: - 8080就能让安全组自动放行 8080 端口。sky status --ip与--env覆盖取 IP 与覆盖环境变量是 SkyPilot CLI 的标准能力仓库内 examples/cog/README.md 等大量示例都采用IP$(sky status --ip cluster)的同一模式保证了脚本的可移植性。同类示例的可迁移性SkyPilot 对 LLM 推理服务采用了统一的YAML 声明资源 run 脚本起服务 端口暴露 curl 验证范式llm/tgi/serve.yaml 与 llm/vllm/README.md 中 vLLM 的 OpenAI 兼容 API 服务均遵循这一结构。理解了 LoRAX 示例即可快速上手仓库中其他推理服务配置。小结LoRAX 的价值在于把千个微调模型压缩到一块 GPU一份基础模型权重常驻显存LoRA 适配器按请求动态交换、同批混跑吞吐随适配器数量近线性扩展。而 SkyPilot 则解决了在哪台机器上跑、如何拿到 IP、如何开放端口、如何持久化缓存、如何优雅停止/清理这一整条运维链路——通过 llm/lorax/lorax.yaml 这样一个不到 20 行的声明式配置即可在 AWS 等云上完成从零到可用推理服务的全流程。对团队而言这意味着多租户的模型超市式推理服务可以以极低硬件成本落地。【免费下载链接】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),仅供参考
返回列表