在 NVIDIA GPU 环境下使用 Paddle 和 FlagCX 指南#
环境配置#
在 NVIDIA GPU 环境上准备一个 docker 容器
启动 docker 容器
sudo docker exec -it [container_name] bash
克隆 Paddle
git clone https://github.com/PaddlePaddle/Paddle.git
使用 FlagCX 编译 Paddle#
请按照以下命令操作:
# 切换到 develop 分支
cd Paddle && git checkout develop
# 创建 build 目录
mkdir build && cd build
# 安装 paddle 依赖
pip install -r ../python/requirements.txt
# 运行 cmake
cmake .. -GNinja -DPY_VERSION=3.10 -DWITH_GPU=ON -DWITH_FLAGCX=ON -DWITH_DISTRIBUTE=ON -DCMAKE_BUILD_TYPE=Release
# 编译
ninja -j$(nproc)
# 定位 paddle whl 包
cd ./python/dist
# 安装 whl 包
pip install -U [whl_package_name]
# 检查安装是否成功
python -c "import paddle;paddle.utils.run_check()"
使用 Paddle + FlagCX 训练模型#
我们支持在 NVIDIA GPU 环境上使用 Paddle + FlagCX 训练 GPT3。请参考以下步骤开始。
克隆 PaddleNLP
git clone https://github.com/PaddlePaddle/PaddleNLP.git
安装依赖
pip install -r requirements.txt pip install -r requirements-dev.txt
下载数据
# 创建数据目录 mkdir -p ./llm/data cd ./llm/data # 下载数据 wget https://bj.bcebos.com/paddlenlp/models/transformers/gpt/data/gpt2_openwebtext_100k.bin wget https://bj.bcebos.com/paddlenlp/models/transformers/gpt/data/gpt2_openwebtext_100k.idx
准备训练脚本
请参考以下脚本训练 GPT3# 这是使用 flagcx 作为通信后端在 NVIDIA GPU 机器上训练 gpt3 的脚本 # 定义根路径 export root_path=/workspace export PYTHONPATH=$root_path/PaddleNLP:$PYTHONPATH export PADDLE_DISTRI_BACKEND=flagcx # 日志 export GLOG_v=0 export FLAGCX_DEBUG=INFO export FLAGCX_DEBUG_SUBSYS=INIT current_date=$(date +"%m%d") task_name="gpt13b_dynamic_hand_nosp_ly4_debug_$current_date" log_dir="log_$current_date/${task_name}_1" output_dir="output_$current_date/${task_name}_1" rm -rf ${log_dir} rm -rf ${output_dir} python -u -m paddle.distributed.launch \ --gpus "0,1,2,3,4,5,6,7" \ --log_dir ${log_dir} \ run_pretrain.py \ ${root_path}/PaddleNLP/tests/test_tipc/dygraph/hybrid_parallelism/gpt3/auto_config_gpt3_13b/pretrain-gpt3_13b-config.json echo "---- $task_name performance:" echo "throughput(tokens/s/card):" cat ${log_dir}/workerlog.0 | grep "interval_tokens_per_second_per_device:" | awk -F ',' '{print $11}' | awk -F ' ' '{print $2}' | awk 'NR > 10 {print $1}' |sort -n | awk '{values[NR] = $1} END {for (i = 3; i <= NR-2; i++) sum += values[i]; print sum / (NR-4)}' echo "max_memory_allocated(GB):" cat ${log_dir}/workerlog.0 | grep "interval_tokens_per_second_per_device:" | awk -F ',' '{print $7}' | tail -n 1 echo "max_memory_reserved(GB):" cat ${log_dir}/workerlog.0 | grep "interval_tokens_per_second_per_device:" | awk -F ',' '{print $8}' | tail -n 1