2017网站建设费用,哪个网站做攻略比较好,wordpress商城购物表单,网站备案名称更改在当今人工智能快速发展的时代#xff0c;大型语言模型#xff08;LLM#xff09;的推理和部署面临着诸多挑战#xff0c;尤其是当模型规模日益庞大时#xff0c;如何高效地利用硬件资源成为关键问题。vLLM 作为一种强大的工具#xff0c;为分布式推理和部署提供了多种策…在当今人工智能快速发展的时代大型语言模型LLM的推理和部署面临着诸多挑战尤其是当模型规模日益庞大时如何高效地利用硬件资源成为关键问题。vLLM 作为一种强大的工具为分布式推理和部署提供了多种策略本文将详细探讨其相关技术和应用场景希望能对您提供有价值的参考。分布式推理策略的选择在开始分布式推理和部署之前明确何时采用分布式推理以及可选的策略至关重要。1. 单 GPU 推理 如果模型能够在单个 GPU 内运行那么无须使用分布式推理直接利用单 GPU 进行推理即可这是最简单且高效的方式。2. 单节点多 GPU张量并行推理 当模型无法在单个 GPU 内运行但可以在配备多个 GPU 的单个节点上容纳时张量并行tensor parallelism技术就派上了用场。张量并行的大小即为该节点上参与计算的 GPU 数量。例如拥有 4 个 GPU 的单节点可将张量并行大小设为 4让多个 GPU 协同工作完成推理任务。3. 多节点多 GPU张量并行与流水线并行相结合的推理 若模型规模巨大以至于单个节点的 GPU 资源都无法满足需求此时需要利用张量并行与流水线并行pipeline parallelism的组合方案。张量并行大小对应每个节点上使用的 GPU 数量流水线并行大小则是所用节点的数量。以 16 个 GPU 分布在 2 个节点每个节点 8 个 GPU为例可将张量并行大小设为 8流水线并行大小设为 2从而在多个节点上高效地进行模型推理。总的来说应逐步增加 GPU 和节点的数量直至 GPU 内存足以容纳模型。确定好张量并行和流水线并行的大小后先运行 vLLM其会输出类似 “# GPU blocks: 790” 的日志将该数值乘以 16块大小可大致估算出当前配置下能够服务的最大 token 数。若此数值不理想如期望更高的吞吐量则可继续增加 GPU 或节点数量直至块数量满足需求。另外还有一种特殊情况如果模型可以容纳在单个节点的多个 GPU 中但 GPU 数量无法整除模型大小此时可以采用流水线并行。它沿着模型层进行分割支持不均匀分割。在这种情况下张量并行大小应为 1流水线并行大小设为 GPU 的数量。vLLM 在单节点上的运行vLLM 支持分布式张量并行和流水线并行推理及服务。目前其采用 Megatron-LM 的张量并行算法并通过 Ray 或 Python 原生 multiprocessing 来管理分布式运行时。在单节点部署时可使用 multiprocessing而多节点推理目前需要 Ray。默认情况下当未在 Ray placement group 中运行且同一节点上有足够的 GPU 满足配置的 “tensor_parallel_size” 时会使用 multiprocessing也可以通过 “LLM” 类的 “distributed_executor_backend” 参数或 “--distributed-executor-backend” API 服务器参数来覆盖此默认设置将其设为 “mp” 表示使用 multiprocessing“ray” 表示使用 Ray且在 multiprocessing 情况下无须安装 Ray。1. 使用 LLM 类进行多 GPU 推理 设置 “tensor_parallel_size” 参数为想要使用的 GPU 数量。例如在 4 个 GPU 上运行推理
from vllm import LLM
llm LLM(facebook/opt-13b, tensor_parallel_size4)
output llm.generate(San Francisco is a)2. 启动多 GPU 服务 在启动服务器时传入 “--tensor-parallel-size” 参数。例如在 4 个 GPU 上运行 API 服务器vllm serve facebook/opt-13b \--tensor-parallel-size 4此外还可以通过指定 “--pipeline-parallel-size” 来启用流水线并行。例如在 8 个 GPU 上同时使用流水线并行和张量并行运行 API 服务器vllm serve gpt2 \--tensor-parallel-size 4 \--pipeline-parallel-size 2vLLM 在多节点上的运行当单个节点的 GPU 资源不足以运行模型时可利用多个节点来进行模型运行。确保所有节点的执行环境相同包括模型路径和 Python 环境至关重要。推荐使用 docker 镜像来保证环境一致性并通过将主机映射到相同的 docker 配置来隐藏主机硬件的异构性。1. 启动容器并组建集群 vLLM 在github上提供了示例脚本 examples/online_serving/run_cluster.sh 来启动集群。需注意该脚本以非管理权限启动 docker这在运行分析和跟踪工具时可能无法访问 GPU 性能计数器。若需此权限可在 docker run 命令中使用 “--cap-add” 选项添加 “CAP_SYS_ADMIN” 权限。选择一个节点作为主节点运行以下命令
bash run_cluster.sh \vllm/vllm-openai \ip_of_head_node \--head \/path/to/the/huggingface/home/in/this/node \-e VLLM_HOST_IPip_of_this_node在其余的工作节点上运行以下命令
bash run_cluster.sh \vllm/vllm-openai \ip_of_head_node \--worker \/path/to/the/huggingface/home/in/this/node \-e VLLM_HOST_IPip_of_this_node这样就形成了一个由容器组成的 Ray 集群。需要注意的是运行这些命令的 shell 必须保持运行状态以维持集群任何 shell 断开连接都会导致集群终止。此外参数 “ip_of_head_node” 应为主节点的 IP 地址且该 IP 地址必须能够被所有工作节点访问。每个工作节点的 IP 地址应通过 “VLLM_HOST_IP” 环境变量指定并且各节点的 IP 地址必须不同。要确保集群中的节点可以通过指定的 IP 地址相互通信。值得注意的是出于安全和性能考虑最好将 “VLLM_HOST_IP” 设置为私有网络段上的地址。因为通过此网络发送的流量未加密且端点之间交换的数据格式如果被恶意方获取网络访问权限可能存在执行任意代码的风险所以必须确保该网络无法被任何不受信任的方访问。注意由于这是一个由容器组成的 Ray 集群所有后续命令都应在容器内执行否则会在主机上执行命令而主机未连接到 Ray 集群。要进入容器可以使用 “docker exec -it node /bin/bash” 命令。进入容器后可执行 “ray status” 和 “ray list nodes” 命令来检查 Ray 集群的状态应能看到正确的节点数量和 GPU 数量。2. 在集群中运行 vLLM 在任意节点再次进入容器后像在单节点上运行 vLLM 一样只需在该节点上运行 “vllm” 命令即可利用 Ray 集群中所有节点的 GPU 资源。通常的做法是将张量并行大小设置为每个节点上的 GPU 数量流水线并行大小设置为节点数量。例如若拥有 16 个 GPU 分布在 2 个节点每个节点 8 个 GPU可设置张量并行大小为 8流水线并行大小为 2vllm serve /path/to/the/model/in/the/container \--tensor-parallel-size 8 \--pipeline-parallel-size 2也可以仅使用张量并行而不使用流水线并行只需将张量并行大小设置为集群中 GPU 的总数。例如若 2 个节点每个节点 8 个 GPU共有 16 个 GPU可设置张量并行大小为 16
vllm serve /path/to/the/model/in/the/container \--tensor-parallel-size 16为使张量并行性能优异需确保节点间的通信高效例如使用高速网卡如 Infiniband。要正确设置集群以使用 Infiniband可在 “run_cluster.sh” 脚本中添加类似 “--privileged -e NCCL_IB_HCAmlx5” 的额外参数。可咨询系统管理员以获取更多关于设置标志的信息。一种确认 Infiniband 是否正常工作的方法是运行带有 “NCCL_DEBUGTRACE” 环境变量的 vLLM例如 “NCCL_DEBUGTRACE vllm serve ...”然后查看日志中的 NCCL 版本和所用网络。如果日志中出现 “[send] via NET/Socket”则表示 NCCL 使用原始 TCP Socket这对于跨节点的张量并行来说效率不高如果出现 “[send] via NET/IB/GDRDMA”则表示 NCCL 使用了带 GPU-Direct RDMA 的 Infiniband这是一种高效的通信方式。注意在启动 Ray 集群后最好还检查节点间的 GPU - GPU 通信这可能需要进行一些复杂的设置。可参考 sanity check 脚本来获取更多信息https://docs.vllm.ai/en/latest/usage/troubleshooting.html#incorrect-hardwaredriver。如果需要设置一些环境变量来配置通信建议在创建集群时将它们添加到 “run_cluster.sh” 脚本中例如 “-e NCCL_SOCKET_IFNAMEeth0”。因为仅在 shell 中设置环境变量如 “NCCL_SOCKET_IFNAMEeth0 vllm serve ...”仅对同一节点上的进程有效而无法对其他节点上的进程生效。另外要确保在所有节点上下载了模型路径相同或者模型被下载到所有节点都可以访问的分布式文件系统中。当使用 huggingface 仓库 ID 来引用模型时应在 “run_cluster.sh” 脚本中追加你的 huggingface 令牌例如 “-e HF_TOKEN” 。推荐的做法是先下载模型然后使用路径来引用模型。注意如果在多节点推理时尽管集群中有足够的 GPU却一直收到 “Error: No available node types can fulfill resource request” 的错误消息很可能是因为节点具有多个 IP 地址而 vLLM 无法找到正确的 IP 地址。请确保 vLLM 和 Ray 使用相同的 IP 地址。可以在 “run_cluster.sh” 脚本中为每个节点正确设置 “VLLM_HOST_IP” 环境变量并通过 “ray status” 和 “ray list nodes” 查看 Ray 使用的 IP 地址。综上所述vLLM 的分布式推理和部署策略为应对大型语言模型的运行挑战提供了灵活且高效的解决方案。无论是单节点多 GPU 还是多节点多 GPU 的场景都能通过合理配置张量并行和流水线并行的大小充分利用集群资源实现高效的模型推理。在实际应用中需根据具体硬件环境和模型规模仔细调整相关参数并注意各种潜在的问题和注意事项以确保 vLLM 能够稳定、高效地运行为人工智能领域的研究和应用提供有力支持。