大模型部署最佳实践

更新时间:
复制为 MD 格式

通过ossfs 2.0 的高吞吐顺序写入和智能缓存机制,可显著优化大模型在云端的下载、存储和部署效率,支持单GPU和多GPU并发部署场景下的高效模型加载。本文介绍如何通过ossfs 2.0下载模型以及safetensors模型在vllm/sglang框架下的部署调优实践和部署其他类型模型的注意事项。

下载模型到OSS

ossfs 2.0 支持高吞吐的顺序写入能力,适用于大模型下载等大文件上传场景。使用ModelScope等工具通过ossfs 2.0可以将仓库中的模型直接写入到OSS Bucket中。

  1. 使用ossfs 2.0标准配置挂载OSS Bucket到指定目录。具体配置示例请参见常用配置示例

  2. 下载模型。

    使用以下ModelScope命令将DeepSeek-R1-0528模型下载到ossfs 2.0的挂载点中。

    modelscope download
    --model deepseek-ai/DeepSeek-R1-0528 --local_dir /mnt/oss/DeepSeek-R1-0528
    --max-workers=32

    ECS中使用ModelScope下载模型时会优先尝试从内网仓库下载模型。当ECS实例网络带宽充足时,ossfs 2.0可高效利用网络资源,充分达到 OSS 默认配置的 20 Gbps 上行带宽上限。

部署场景

当前 AI 模型种类丰富,文件格式多样,常见的包括 safetensors(安全高效)、PyTorch(通用性强)、GGUF(适用于本地推理)等。为充分发挥OSS上模型的加载性能,建议根据实际部署架构合理配置 ossfs 2.0。

在基于 GPU 数量划分的典型部署场景下,ossfs 2.0配置建议如下:

  • 单 GPU 部署场景

    对于单卡 GPU 的模型部署,ossfs 2.0 默认挂载配置已具备良好的加载性能。

  • 单机多 GPU 并发部署场景

    在单机多卡并发加载同一模型时,多个进程会同时读取同一模型文件的不同分片,易导致带宽放大问题。为解决此问题,ossfs 2.0 支持通过 --memory_data_cache_size 挂载选项开启固定大小的内存缓存机制。启用后,模型文件仅从 OSS 下载一次,多进程共享本地缓存数据,能显著降低网络负载与加载延迟。

    说明

    ossfs 2.0 当前提供的内存缓存模式主要用于优化多进程并发访问同一文件时的带宽放大问题,进程内的缓存数据将在最后一个文件句柄关闭后同步释放。该模式不影响读取数据后加载到操作系统PageCache的缓存数据,这部分数据缓存行为和标准模式一致。详细说明参见挂载选项说明

通过合理配置 ossfs 2.0,可提升各类大模型在云端的加载效率与部署稳定性。更多信息,请参见部署safetensors模型部署其他格式模型

部署safetensors模型

safetensors 格式模型具有安全性高、加载速度快的特点,是当前主流的大模型存储格式。ossfs 2.0 针对此类模型提供了优化的部署方案。

测试环境

  • 测试环境:灵骏 8 GPU节点、192 vCPU、2 TiB内存、200 Gbps带宽、OSS下载带宽限制100 Gbps

  • 软件版本:ossfs 1.91.8、ossfs2 2.0.5、Python 3.12、SGLang 0.5.5

挂载方法

  • ossfs 1.0挂载命令

    ossfs <bucket> /mnt/oss -o url=http://<endpoint> -o parallel_count=64
  • ossfs 2.0配置文件及挂载命令

    • 配置文件

      创建配置文件/etc/ossfs2.conf后,添加如下内容并保存。请根据实际替换示例中的Bucket名称、EndpointAccessKey信息。

      --oss_bucket=<bucket>
      --oss_endpoint=http://<endpoint>
      --oss_access_key_id=<ak>
      --oss_access_key_secret=<sk>
      # 配置16 GiB内存缓存模式减少并发读取带来的带宽放大
      --memory_data_cache_size=16g
    • 挂载命令

      ossfs2 mount /mnt/oss -c /etc/ossfs2.conf

部署方法

safetensors模型支持直接启动模型服务或者通过PageCache预热方式部署模型服务。

直接部署

适用于内存资源有限的场景。使用以下测试命令指定模型文件路径启动模型服务:

python -m sglang.launch_server --model-path <model> --tensor-parallep-size <tp>

(推荐)PageCache预热部署

适用于内存充足的生产环境。通过预热机制将模型文件预先加载至操作系统的 PageCache 中。该方式将原本的随机(乱序)读取转化为 “顺序读预加载 + 缓存内随机访问” 的混合模式,显著减少OSS网络请求次数和延迟。

使用以下命令预热并启动模型服务:

# 预热数据,该命令启动了16个进程并发cat该模型目录下的文件,cat完成后数据会驻留在操作系统的pagecache中
find "<model>" -type f -print0 | xargs -0 -I {} -P "16" sh -c 'cat "{}" > /dev/null && cat "{}" > /dev/null'
# 启动服务
python -m sglang.launch_server --model-path <model> --tensor-parallep-size <tp>
重要
  • PageCache由操作系统管理,如果节点的空闲内存不足,或在容器环境中限制了容器的内存,则会导致已预取的数据被提前回收释放。请确保可用内存超过模型总大小,并预留一部分冗余内存给模型服务进程和ossfs 2.0进程使用,这部分缓存数据在数据加载完毕后会由操作系统自动管理,不会永久占用系统资源。

  • 请确保部署模型服务的节点上不要同时存在其他业务读取大量文件,否则可能因为系统内存压力导致预取的数据被提前回收释放。

加载时间对比

该结果仅记录了部署过程中模型加载的时间(越小越好),测试结果中不包含服务初始化以及后续的模型预热等步骤。

重要

ossfs 1.0在加载DeepSeek-R1-0528模型时会写满系统盘导致系统卡死,需额外配置800 GiB的本地磁盘以支持写入。

image

由上图可知,ossfs 2.0相比1.0版本在模型加载时间上有显著提升。

部署其他格式模型

GGUF模型部署注意事项

ossfs 2.0在文件打开后会预分配一部分内存进行数据预取,这部分内存会在文件关闭后归还。但由于目前llama.cpp框架在读取数据时没有关闭已读取完毕的文件句柄,对于文件数量较多的模型仓库,后续文件没有对应的内存资源进行预取,从而导致加载效率下降。

使用ossfs 2.0加载该类型模型时,有以下两种优化方案:

  • 预热PageCache方案:具体说明请参见PageCache预热部署

  • 不限制预取内存方案:配置--prefetch_chunks=-1,默认配置下最多会使用约模型文件的个数 × 1.5 GiB的额外内存。

如果所用的GGUF模型较大且无法使用上述两种方案,请使用OSS Connector for AI/ML进行模型加载。

PyTorch模型部署注意事项

在多GPU场景下使用EasyRec部署PyTorch模型,每个GPU会顺序全量加载一次模型文件。配置--memory_data_cache_size=4g挂载选项可有效减少并发读取带来的带宽放大,加快整体模型加载效率。