优化与调优#
本指南旨在帮助用户在系统层面提升 vllm-ascend 的性能。内容涵盖操作系统配置、库优化、部署指南等。欢迎任何反馈。
准备工作#
运行容器:
# Update DEVICE according to your device (/dev/davinci[0-7])
export DEVICE=/dev/davinci0
# Update the cann base image
export IMAGE=m.daocloud.io/quay.io/ascend/cann:8.3.rc2-910b-ubuntu22.04-py3.11
docker run --rm \
--name performance-test \
--device $DEVICE \
--device /dev/davinci_manager \
--device /dev/devmm_svm \
--device /dev/hisi_hdc \
-v /usr/local/dcmi:/usr/local/dcmi \
-v /usr/local/bin/npu-smi:/usr/local/bin/npu-smi \
-v /usr/local/Ascend/driver/lib64/:/usr/local/Ascend/driver/lib64/ \
-v /usr/local/Ascend/driver/version.info:/usr/local/Ascend/driver/version.info \
-v /etc/ascend_install.info:/etc/ascend_install.info \
-v /root/.cache:/root/.cache \
-it $IMAGE bash
配置您的环境:
# Configure the mirror
echo "deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy main restricted universe multiverse" > /etc/apt/sources.list && \
echo "deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy main restricted universe multiverse" >> /etc/apt/sources.list && \
echo "deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy-updates main restricted universe multiverse" >> /etc/apt/sources.list && \
echo "deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy-updates main restricted universe multiverse" >> /etc/apt/sources.list && \
echo "deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy-backports main restricted universe multiverse" >> /etc/apt/sources.list && \
echo "deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy-backports main restricted universe multiverse" >> /etc/apt/sources.list && \
echo "deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy-security main restricted universe multiverse" >> /etc/apt/sources.list && \
echo "deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy-security main restricted universe multiverse" >> /etc/apt/sources.list
# Install os packages
apt update && apt install wget gcc g++ libnuma-dev git vim -y
安装 vllm 和 vllm-ascend:
# Install necessary dependencies
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
pip install modelscope pandas datasets gevent sacrebleu rouge_score pybind11 pytest
# Configure this var to speed up model download
VLLM_USE_MODELSCOPE=true
请按照 安装指南 操作,确保 vLLM、vllm-ascend 和 MindIE Turbo 已正确安装。
备注
请确保在完成 Python 配置后再安装 vLLM 和 vllm-ascend,因为这些包会使用当前环境中的 Python 构建二进制文件。如果您在完成 1.1 节之前安装了 vLLM、vllm-ascend 和 MindIE Turbo,则生成的二进制文件将无法利用优化后的 Python。
优化项#
1. Compilation Optimization#
1.1. 安装优化版 python#
Python 从 3.6 及以上版本开始支持 LTO 和 PGO 优化,这些优化可以在编译时启用。为了方便起见,我们直接向用户提供优化后的 python 软件包。您也可以参考此 教程 根据具体场景自行构建。
mkdir -p /workspace/tmp
cd /workspace/tmp
# Download prebuilt lib and packages
wget https://repo.oepkgs.net/ascend/pytorch/vllm/lib/libcrypto.so.1.1
wget https://repo.oepkgs.net/ascend/pytorch/vllm/lib/libomp.so
wget https://repo.oepkgs.net/ascend/pytorch/vllm/lib/libssl.so.1.1
wget https://repo.oepkgs.net/ascend/pytorch/vllm/python/py311_bisheng.tar.gz
# Configure python and pip
cp ./*.so* /usr/local/lib
tar -zxvf ./py311_bisheng.* -C /usr/local/
mv /usr/local/py311_bisheng/ /usr/local/python
sed -i "1c#\!/usr/local/python/bin/python3.11" /usr/local/python/bin/pip3
sed -i "1c#\!/usr/local/python/bin/python3.11" /usr/local/python/bin/pip3.11
ln -sf /usr/local/python/bin/python3 /usr/bin/python
ln -sf /usr/local/python/bin/python3 /usr/bin/python3
ln -sf /usr/local/python/bin/python3.11 /usr/bin/python3.11
ln -sf /usr/local/python/bin/pip3 /usr/bin/pip3
ln -sf /usr/local/python/bin/pip3 /usr/bin/pip
export PATH=/usr/bin:/usr/local/python/bin:$PATH
2. OS Optimization#
2.1. jemalloc#
jemalloc 是一种内存分配器,可提升多线程场景下的性能并减少内存碎片。jemalloc 使用线程本地内存管理来分配变量,从而避免线程间的锁竞争,能极大优化性能。
# Install jemalloc
sudo apt update
sudo apt install libjemalloc2
# Configure jemalloc
export LD_PRELOAD=/usr/lib/"$(uname -i)"-linux-gnu/libjemalloc.so.2 $LD_PRELOAD
2.2. Tcmalloc#
Tcmalloc (Thread Counting Malloc) 是一种通用内存分配器,它通过引入多级缓存结构、减少互斥锁竞争并优化大对象处理流程,在确保低延迟的同时提升整体性能。点击 此处 了解更多细节。
# Install tcmalloc
sudo apt update
sudo apt install libgoogle-perftools4 libgoogle-perftools-dev
# Get the location of libtcmalloc.so*
find /usr -name libtcmalloc.so*
# Make the priority of tcmalloc higher
# The <path> is the location of libtcmalloc.so we get from the upper command
# Example: "$LD_PRELOAD:/usr/lib/aarch64-linux-gnu/libtcmalloc.so"
export LD_PRELOAD="$LD_PRELOAD:<path>"
# Verify your configuration
# The path of libtcmalloc.so will be contained in the result if your configuration is valid
ldd `which python`
3. torch_npu Optimization#
torch_npu 中的某些性能调优特性受环境变量控制。部分特性及其相关的环境变量如下所示。
内存优化:
# Upper limit of memory block splitting allowed (MB): Setting this parameter can prevent large memory blocks from being split.
export PYTORCH_NPU_ALLOC_CONF="max_split_size_mb:250"
# When operators on the communication stream have dependencies, they all need to be ended before being released for reuse. The logic of multi-stream reuse is to release the memory on the communication stream in advance so that the computing stream can be reused.
export PYTORCH_NPU_ALLOC_CONF="expandable_segments:True"
调度优化:
# Optimize operator delivery queue. This will affect the memory peak value, and may degrade if the memory is tight.
export TASK_QUEUE_ENABLE=2
# This will greatly improve the CPU bottleneck model and ensure the same performance for the NPU bottleneck model.
export CPU_AFFINITY_CONF=1
4. CANN Optimization#
4.1. HCCL 优化#
HCCL 中包含一些性能调优特性,这些特性通过环境变量进行控制。
您可以通过设置下方的环境变量,配置 HCCL 使用 "AIV" 模式来优化性能。在 "AIV" 模式下,通信由 AI Vector Core 配合 RoCE 直接调度,不再由 AI CPU 调度。
export HCCL_OP_EXPANSION_MODE="AIV"
此外,针对特定场景还有更多性能优化特性,如下所示。