ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

vLLM × Tensorizer:将模型张量序列化到 S3/HTTP,实现 GPU 直载的极速启动

vLLM × Tensorizer:将模型张量序列化到 S3/HTTP,实现 GPU 直载的极速启动 vLLM × Tensorizer将模型张量序列化到 S3/HTTP实现 GPU 直载的极速启动【免费下载链接】vllmA high-throughput and memory-efficient inference and serving engine for LLMs项目地址: https://gitcode.com/GitHub_Trending/vl/vllm本篇指南围绕 vLLM 官方文档 docs/models/extensions/tensorizer.md 展开讲解如何利用 CoreWeave 的 Tensorizer 将 vLLM 模型张量序列化到本地磁盘、HTTP(S) 端点或 S3 桶并在运行时直接把张量反序列化到 GPU从而显著缩短 Pod 启动时间并降低 CPU 内存占用。读完本文你可以独立完成模型序列化含 LoRA 适配器和加密、通过vllm serve或LLM()加载 tensorized 模型并用model_loader_extra_config精细调节序列化/反序列化行为同时理解 vLLM 源码中TensorizerLoader的加载链路与 GPU 直载优化原理。1. Tensorizer 与 vLLM 的集成方式vLLM 原生支持 CoreWeave 的 Tensorizer 作为模型加载格式load_formattensorizer。其核心优势是GPU 直载序列化后的模型张量可以在运行时被极快地反序列化并直接落到 GPU 上跳过了传统 HuggingFace 权重先落 CPU 内存再拷贝到 GPU的路径多存储后端支持本地磁盘、HTTP/HTTPS 端点和 S3 端点天然适合容器化部署中权重放对象存储、Pod 冷启动拉取的场景加密支持Tensor 加密/解密受支持解密功能依赖 libsodium。从源码结构看vLLM 将 Tensorizer 完全融入了其模型加载机制model loading machinery加载器注册vllm/model_executor/model_loader/init.py 中把字符串tensorizer映射到TensorizerLoader类因此只要--load-format tensorizer就会走该加载器核心实现集中在两个文件vllm/model_executor/model_loader/tensorizer.pyTensorizerConfig、TensorizerArgs、序列化/反序列化工具函数serialize_vllm_model、deserialize_tensorizer_model、is_vllm_tensorized等vllm/model_executor/model_loader/tensorizer_loader.pyTensorizerLoader类负责决定GPU 直载还是CPU 回退两条加载路径序列化入口示例脚本 examples/features/tensorize_vllm_model.py 会创建独立的LLMEngine并通过collective_rpc(save_tensorized_model, ...)把保存操作下发到每个 workerworker 侧的实现是 gpu_worker.py 中的save_tensorized_model它调用TensorizerLoader.save_model完成真正落盘。2. 安装 Tensorizer按官方文档安装命令为pip install vllm[tensorizer]从 setup.py 的 extras 定义可以看到tensorizerextra 当前固定依赖版本为tensorizer2.10.1。若你从源码安装 vLLM 并启用该 extra即可获得完整的序列化/反序列化能力。3. 用 Tensorizer 序列化 vLLM 模型要加载 Tensorizer 模型模型必须先经过 Tensorizer 序列化。vLLM 仓库自带示例脚本 examples/features/tensorize_vllm_model.py它会从 HuggingFace 下载模型、加载进 vLLM、序列化张量并保存到目标目录本地目录或 S3 URI。3.1 基础序列化示例以facebook/opt-125m为例序列化并保存到 S3 桶s3://my-bucketpython examples/features/tensorize_vllm_model.py \ --model facebook/opt-125m \ serialize \ --serialized-directory s3://my-bucket \ --suffix v1执行后模型张量被保存至s3://my-bucket/vllm/facebook/opt-125m/v1。路径规则见脚本 docstring 与 tensorizer.py 中tensorize_vllm_model的构造逻辑为{serialized-directory}/vllm/{model_ref}/{suffix}/model.tensors其中--suffix用于区分不同版本若不提供 suffix脚本会生成一个随机 UUID。--serialized-directory也可以替换为本地目录路径。关于 S3 凭据脚本会优先使用--s3-access-key-id、--s3-secret-access-key、--s3-endpoint三个 CLI 参数其次回退到环境变量S3_ACCESS_KEY_ID、S3_SECRET_ACCESS_KEY、S3_ENDPOINT_URL这三个变量在 vllm/envs.py 中注册为 vLLM 已知环境变量TensorizerArgs构造时也会用它们补齐 stream 参数。3.2 连同 LoRA 适配器一起序列化如果计划对 tensorized 模型应用 LoRA 适配器可以在序列化命令中追加--lora-path lora_id传入 LoRA 适配器的 HF id适配器工件会一并保存到同一目录python examples/features/tensorize_vllm_model.py \ --model facebook/opt-125m \ --lora-path lora_id \ serialize \ --serialized-directory s3://my-bucket \ --suffix v1从源码看这一步由 tensorizer.py 中的tensorize_lora_adapter完成它读取适配器目录下的adapter_model.safetensors或.bin与adapter_config.json把张量写为{tensorizer_dir}/adapter_model.tensors同时把配置写为{tensorizer_dir}/adapter_config.json。之后加载时只需让 LoRA 工件位于模型工件目录内并开启--enable-lora即可。3.3 张量并行TP 1的分布式分片序列化对于 tensor-parallel 模型脚本会把每个分片序列化为独立文件tensorizer_uri是一个带格式说明符的字符串模板按分片的 rank 渲染。从 tensorize_vllm_model.py 的main()可以看到当tensor_parallel_size 1时输出命名规则为{base_path}/model-rank-%03d.tensors加载侧的校验逻辑在 tensorizer.py 的verify_with_parallel_config中若tensor_parallel_size 1且 URI 不含%0\dd形式的模板如%04d、%03d会直接抛出ValueError。3.4 加密序列化提供--keyfile参数即可用随机生成的二进制密钥加密模型权重密钥保存到该路径要求已安装 libsodium。对应实现见 tensorizer.py 中tensorize_vllm_model的EncryptionParams.random()逻辑与serialize_vllm_model中的EncryptionParams(keykey)。反序列化时用--keyfile指向密钥文件即可解密。仓库测试 tests/model_executor/model_loader/tensorizer_loader/test_tensorizer.py 中的test_deserialized_encrypted_vllm_model_has_same_outputs验证了加密序列化后加载的输出与普通加载一致。3.5 序列化时还会附带哪些工件serialize_vllm_model完成张量写盘后还会调用serialize_extra_artifacts它通过 HF API 下载模型的 snapshot忽略*.pt、*.safetensors、*.bin等权重文件把 config、tokenizer 等非权重文件逐个写入tensorizer_dir。这保证了加载端把整个目录作为model路径时能同时拿到张量与配套元数据。4. 使用 Tensorizer 加载与部署模型模型序列化完成后可通过vllm serve或LLM入口加载。把之前保存模型的目录传给model参数即可。4.1 vllm serve含 LoRAvllm serve s3://my-bucket/vllm/facebook/opt-125m/v1 \ --load-format tensorizer \ --enable-lora4.2 LLM() 入口from vllm import LLM llm LLM( s3://my-bucket/vllm/facebook/opt-125m/v1, load_formattensorizer, enable_loraTrue, )4.3 用示例脚本做反序列化自检不启动服务、只验证模型能否反序列化并正常推理可以用脚本的deserialize子命令python examples/features/tensorize_vllm_model.py \ --model EleutherAI/gpt-j-6B \ --dtype float16 \ deserialize \ --path-to-tensors s3://my-bucket/vllm/EleutherAI/gpt-j-6B/v1/model.tensors--path-to-tensors与--serialized-directory二者必须提供其一后者假定目录内存在model.tensors且不能同时提供。若模型序列化时开启了加密需追加--keyfile指向解密密钥。5. 配置 TensorizerTensorizerConfig 与 model_loader_extra_configTensorizer 的核心对象是TensorSerializer序列化和TensorDeserializer反序列化。vLLM 允许通过model_loader_extra_config向它们透传任意 kwargs键分别为serialization_kwargs与deserialization_kwargs。所有可用参数完整定义在 Tensorizer 库的serialization.py模块中可通过pip install vllm[tensorizer]安装后本地查阅。5.1 序列化侧限制 CPU 并发TensorSerializer初始化参数中的limit_cpu_concurrency可限制序列化时的 CPU 并发度python examples/features/tensorize_vllm_model.py \ --model facebook/opt-125m \ --lora-path lora_id \ serialize \ --serialized-directory s3://my-bucket \ --serialization-kwargs {limit_cpu_concurrency: 2} \ --suffix v1注意--serialization-kwargs的值必须是能解析为 dict 的 JSON 字符串解析校验在 tensorizer.py 的tensorizer_kwargs_arg中完成。5.2 反序列化侧限制并发读线程数TensorDeserializer初始化参数中的num_readers控制并发读取源文件的线程数默认None表示根据可用资源和模型大小动态设置性能更佳。通过--model-loader-extra-config传入vllm serve s3://my-bucket/vllm/facebook/opt-125m/v1 \ --load-format tensorizer \ --enable-lora \ --model-loader-extra-config {deserialization_kwargs: {num_readers: 2}}或等价地用LLM()from vllm import LLM llm LLM( s3://my-bucket/vllm/facebook/opt-125m/v1, load_formattensorizer, enable_loraTrue, model_loader_extra_config{deserialization_kwargs: {num_readers: 2}}, )从源码看model_loader_extra_config最终汇聚进TensorizerConfigtensorizer.py 中的 dataclass再由TensorizerArgs.__init__合并为传给TensorDeserializer的deserialization_kwargs其中verify_hash、encryption、num_readers会与自定义 kwargs 合并。5.3 TensorizerConfig 的主要字段结合 tensorizer.py 的字段定义与 docstringTensorizerConfig支持的关键配置项包括字段说明tensorizer_uri序列化张量文件的路径支持本地文件或 S3/HTTP(S) URI。未提供tensorizer_dir/lora_dir时为必填tensorizer_dir存放model.tensors及其他模型工件的目录可替代tensorizer_urivllm_tensorized标记是否为 vLLM 模型序列化产物。现已废弃——新序列化的 vLLM 模型会自动推断见下文 marker 机制该标记仅用于旧版本产物verify_hash若为 True每个 tensor 的哈希会与元数据中存储的哈希校验不匹配则抛HashMismatchErrornum_readers并发读取线程数默认动态决定encryption_keyfile二进制解密密钥文件路径None表示不解密s3_access_key_id/s3_secret_access_key/s3_endpointS3 凭据与端点也可用同名环境变量设置lora_dir序列化/反序列化 LoRA 适配器工件的目录仅序列化 LoRA 时它是唯一必需参数serialization_kwargs/deserialization_kwargs透传给TensorSerializer/TensorDeserializer的额外 kwargs另外示例脚本的deserialize子命令还暴露了一组 tensorizer options CLI 参数由TensorizerArgs.add_cli_args注册见 tensorizer.py可通过python examples/features/tensorize_vllm_model.py deserialize --help查看--tensorizer-uri、--verify-hash、--encryption-keyfile、--num-readers、--s3-access-key-id、--s3-secret-access-key、--s3-endpoint。需要特别注意 tensorizer_loader.py 中的黑名单BLACKLISTED_TENSORIZER_ARGS { device, # vLLM decides this dtype, # vLLM decides this mode, # Not meant to be configurable by the user }即device、dtype、mode三个参数不允许由用户通过 extra config 覆盖——目标设备与精度由 vLLM 的 device/model 配置决定。若传入了非 None 的黑名单参数加载会直接抛出ValueError。6. 底层原理GPU 直载是如何实现的TensorizerLoader.load_modeltensorizer_loader.py在加载时先做两件事若tensor_parallel_size 1用当前 worker 的 tensor-parallel rank 对tensorizer_uri做%格式化使每个进程加载对应分片model-rank-%03d.tensors通过is_vllm_tensorized判断产物是否为 vLLM 模型它会以lazy_loadTrue打开 deserializer检查张量键中是否存在.vllm_tensorized_marker。序列化侧的对应实现在serialize_vllm_model中——给模型注册了一个 meta 设备上的vllm_tensorized_marker参数作为指纹。随后进入两条分支vLLM 直载路径is_vllm_tensorized为 True先用init_tensorizer_model在 meta tensor 模式下构造模型骨架tensorizer.py 中meta_tensor_mode/MetaTensorMode会把aten::empty强制落到 meta 设备避免在 CPU 上分配真实权重再由deserialize_tensorizer_model打开流并创建TensorDeserializer(devicef{device_type}:{device_index})直接load_into_module(model)把张量写进 GPU。完成后还会用_check_tensors_on_meta_device检查是否有张量仍停留在 meta 设备说明参数不匹配如量化配置不一致有则报错用_resize_lora_embeddings为 LoRA 新增 token 扩大 embedding 层记录反序列化吞吐bytes/s与前后内存占用日志。HuggingFace 回退路径非 vLLM 产物_load_model_serialized_cpu会正常初始化模型并调用model.load_weights权重经tensorizer_weights_iterator逐张量迭代——此路径被强制加载到 CPU源码中明确警告HuggingFace 模型的反序列化未针对 vLLM 优化因为 tensorizer 被迫加载到 CPU比默认 HF 加载快但慢于 vLLM 直载路径。这也是官方推荐用示例脚本序列化 vLLM 模型的原因。下载校验方面TensorizerLoader.download_model会在加载前用open_stream打开 URI 验证可达性is_valid_deserialization_uri要求 URI 的 scheme 属于s3/http/https或指向一个已存在的本地文件。7. 验证手段与参考测试仓库中围绕 Tensorizer 提供了多层测试可作为功能验证的蓝本tests/model_executor/model_loader/tensorizer_loader/test_tensorizer.py覆盖加密模型输出一致性、序列化配置、错误路径等注意其 conftest 中设置了VLLM_ALLOW_INSECURE_SERIALIZATION1以允许测试环境中的引擎内序列化传输tests/entrypoints/openai/completion/test_tensorizer_entrypoint.py通过 OpenAI 兼容服务端到端验证 tensorized 模型提供推理服务tests/model_executor/model_loader/tensorizer_loader/conftest.py提供just_serialize_model_tensors等 fixture演示了用EngineArgsTensorizerConfig直接调用tensorize_vllm_model的最小序列化流程。8. 小结与适用边界适用前提使用 S3 需配置凭据CLI 参数或S3_ACCESS_KEY_ID/S3_SECRET_ACCESS_KEY/S3_ENDPOINT_URL环境变量加密功能要求安装 libsodiumpip install vllm[tensorizer]当前固定tensorizer2.10.1。性能建议优先使用示例脚本序列化 vLLM 模型以获得 GPU 直载路径仅在无法重新序列化时才回落到 HF 权重的 CPU 加载路径。已知限制TensorizerConfig.verify_with_model_config会对Tensorizer 量化组合发出告警源码注释表明该组合不稳定、可能引发错误device/dtype/mode不可由用户覆盖。调试抓手反序列化完成时的日志会输出总字节数、耗时与 bytes/s 吞吐以及前后内存用量可直接用于量化启动加速效果。通过本文的完整流程——pip install vllm[tensorizer]→ 示例脚本序列化可选 LoRA/加密/TP 分片→vllm serve或LLM()加载 →model_loader_extra_config调参——你可以把 Tensorizer 纳入生产部署的镜像启动链路把权重分发与模型加载的耗时问题从CPU 内存 权重拷贝瓶颈中解放出来。【免费下载链接】vllmA high-throughput and memory-efficient inference and serving engine for LLMs项目地址: https://gitcode.com/GitHub_Trending/vl/vllm创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表