Modal LoRA热加载:多租户推理服务实践
讲解在 Modal Function 中挂载 Volume、由 vLLM 通过 model 字段按请求选择 LoRA 适配器,并使用受控管理接口加载或卸载适配器,帮助多租户推理服务明确隔离与验证方法。
Modal LoRA 热加载可落成一套受控架构:在 Modal Function 中依照 Modal 的 GPU 指南 配置 GPU、运行 vLLM,由管理端通过 vLLM 的 LoRA 文档 所列接口加载、卸载适配器,推理请求只选择已登记的适配器;该文档同时说明适配器可按请求提供,但警告运行时加载只应使用在隔离且完全可信的环境中,否则不应投入生产。多租户部分应固定“租户—内部名称—受控路径”的映射,不让请求提交任意路径;本文的大模型部署示例依次给出准备、挂载、热加载、验证和故障处理。
Modal LoRA 服务的大模型部署架构
基础模型先确认实现 SupportsLoRA;vLLM 的 LoRA 服务说明列出了用 --lora-modules 在启动时声明适配器、在请求的 model 字段中选择名称,以及让 max_loras、max_lora_rank、max_cpu_loras 应用于后续请求的方法。--lora-modules 的 JSON 形式会明确携带 base_model_name;旧 name=path 形式仍可用,但该字段会保持未指定。一个 prompt 仍只应用一个 LoRA。
在 Modal 使用 GPU 还需要账户中留有有效付款方式,部署前应一并检查 Modal 的 GPU 要求。同时登记基础模型名称、每个适配器的受控路径、rank 和所属租户,避免把模型名相近当成兼容依据。
准备 Volume:挂载共享适配器目录
Modal 的 Volume 指南把 Volume 定位为适合模型权重一次写入、多次读取的分布式文件系统。可以先用 CLI 创建 v2 Volume:
modal volume create YOUR_VALUE --version=2
也可以在代码中按需取得同名 Volume,再通过 Function 装饰器挂载到 /adapters:
import modal
app = modal.App(name="inference-engine")
adapters = modal.Volume.from_name(
"YOUR_VALUE",
create_if_missing=True,
)
@app.function(
gpu="YOUR_VALUE",
volumes={"/adapters": adapters},
)
def inference():
...
把 gpu 替换为当前 Modal GPU 指南中适合你的值。这里的 /adapters 是 Function 级挂载,不是每个请求重新挂载;多租户隔离应通过租户目录和服务端映射完成,而不是让请求触发 Volume 切换。
Modal LoRA 热加载:启动、加载与卸载
在启动 vLLM 进程前设置运行时更新开关,再按文档中的 JSON 形式登记初始适配器:
export VLLM_ALLOW_RUNTIME_LORA_UPDATING=True
vllm serve meta-llama/Llama-3.2-3B-Instruct \
--enable-lora \
--lora-modules '{"name": "YOUR_VALUE", "path": "YOUR_VALUE", "base_model_name": "meta-llama/Llama-3.2-3B-Instruct"}'
后续适配器由管理端向 /v1/load_lora_adapter