Modal存储卷调优:缓存与读写参数配置

说明如何在 Modal 中创建、挂载和上传模型权重,以只读挂载、提交与重载管理 Volume,并区分卷一致性与 vLLM prefix cache 的调优方法。

做模型部署时,Modal Volume 应按“一次写入、多次读取”来使用:Modal 的 Volume 指南 将模型权重列为这种负载,却没有列出缓存容量、TTL 或淘汰策略。把权重预先上传到 Volume,并用 @modal.enter 在每个新容器启动时加载一次,是 Modal 模型权重指南 给出的组织方式。你需要重点配置的是挂载、提交、重载与并发写入边界。

模型部署中的 Modal Volume 调优:版本与读写边界

按 Modal Volume 指南 当前的版本、带宽和一致性规则配置:

  • v1 Volume 在文件和目录少于 50,000 时表现最好;硬上限为 500,000 个 inodes,包括文件、目录和符号链接,超过后创建文件会以 ENOSPC 失败。
  • v2 仍处于 Beta,Modal 目前不建议将其用于关键任务数据。v2 没有总文件数限制,但单个文件必须小于 1 TiB,单个目录最多存放 262,144 个文件。
  • Volume 的设计带宽最高为 2.5 GB/s,但这不是保证值;实际吞吐量可能受网络条件影响而降低。

通过 CLI 创建 Volume 时使用以下入口:

modal volume create YOUR_VOLUME_NAME

创建 v2 Volume 时加入文档给出的参数:

modal volume create YOUR_VOLUME_NAME --version=2

也可以在代码中按需创建:

vol = modal.Volume.from_name("my-volume", create_if_missing=True)

挂载时,将容器路径映射到 Volume:

@app.function(volumes={"/data": vol})

只执行推理的容器应优先使用只读挂载:

volumes={"/data": volume.with_mount_options(read_only=True)},

本地模型权重可以通过 Modal 模型权重指南 给出的命令上传:

modal volume put model-weights-vol path/to/model path/on/volume

提交、重载与并发写入

容器创建时会挂载 Volume 的最新状态;后续提交的内容不会自动出现,需要调用 .reload()。容器内的变更也必须提交后才能在外部可见。Function 或 Sandbox 运行期间,Modal 会每隔几秒执行后台提交,并在容器关闭时完成最终提交。

v2 可以在 Sandbox 或 modal shell 中对挂载点执行 sync:

sync /data

如果 Volume 中仍有打开的文件,.reload() 会以 volume busy 失败。多个写入者修改同一个文件时采用 last-write-wins,Volume 不支持分布式文件锁。对于 v1 上的小变更,应避免超过 5 个并发提交。

缓存策略:区分权重、共享状态与 prefix cache

先把缓存分成三类,再决定配置:

  • 模型权重:视为一次写入、持续读取的数据,预存到 Volume,并给推理容器只读挂载。
  • 跨容器输出:如果多个容器需要读取同一结果,就把提交和重载作为可见性边界;不需要共享的临时输出不要依赖共享 Volume。
  • 推理 prefix cache:vLLM Benchmark CLI 文档 提醒,对同一个 server 重复运行 vllm bench serve 可能复用留在 prefix cache 中的 prompts,从而抬高吞吐量。因此,不能把重复运行后的提升直接归因于 Volume 存储。

如果你需要控制 prefix cache 的开关、作用范围或保留方式,应检查当前 vLLM 部署文档;上述 Benchmark CLI 文档没有提供这些控制参数。

读写参数:用受控负载验证存储影响

Volume 侧应使用前节的 read_only=True、提交、重载和并发规则。vLLM 侧则可以使用 Benchmark CLI 文档 中的负载参数,但不要把它们误称为磁盘读写参数:

  • --request-rate 控制每秒目标请求数;inf 表示最大吞吐量,也是默认值,并会立即发送全部请求。
  • --max-concurrency 限制尚未完成的并发请求;不设置时并发数不受限制。
  • --burstiness 使用 Gamma 分布控制流量波动,范围必须大于 0;1.0 表示 Poisson 流量。
  • --ramp-up-strategy 接受 linear 或 exponential,用于控制运行期间的请求爬升方式。

按自己的基线填写参数,不要直接沿用示例值:

--request-rate YOUR_VALUE
--max-concurrency YOUR_VALUE
--burstiness YOUR_VALUE
--ramp-up-strategy linear

官方记录的基础命令为:

vllm bench serve \
  --backend vllm \
  --model NousResearch/Hermes-3-Llama-3.1-8B \
  --endpoint /v1/completions \
  --dataset-name sharegpt

比较不同存储配置时,应保持模型、prompt、请求速率、并发度及 prefix cache 状态一致,每次只改变一个配置项。

验证服务并定位常见错误

先在启动阶段检查 /data/YOUR_MODEL_PATH 是否存在,再验证 vLLM 服务。按照 vLLM Quickstart,默认监听地址为 http://localhost:8000,可以这样查询模型端点:

curl http://localhost:8000/v1/models

这个请求只验证服务与模型端点是否正常,不代表 Volume 带宽或缓存效果。记录验证结果时,应同时保存 Volume 版本、挂载路径、只读状态、模型路径、压测参数、prompt 集,以及是否对同一 server 重复运行。

常见错误可以直接映射回前面的边界:路径检查失败时,核对上传目标与 /data 挂载路径;内容过期时,检查提交和 .reload();出现 volume busy 时,先关闭 Volume 中的文件;出现 ENOSPC 时,重新核对 v1 的 inode 规模。

这些步骤按正文链接的官方文档整理,未做运行或测量;使用前请对照当前版本检查。

资料来源