• deepspeed 训练多机多卡报错 ncclSystemError Last error


     

    最近在搞分布式训练大模型,踩了两个晚上的坑今天终于爬出来了

    我们使用 2台 8*H100

    遇到过

    错误1

    10.255.19.85: ncclSystemError: System call (e.g. socket, malloc) or external library call failed or device error.
    10.255.19.85: Last error:
    10.255.19.85: socketStartConnect: Connect to 127.0.0.1<34273> failed : Software caused connection abort

    错误2

    10.255.19.82: torch.distributed.DistBackendError: [7] is setting up NCCL communicator and retrieving ncclUniqueId from [0] via c10d key-value store by key '0', but store->get('0') got error: Connection reset by

    错误3

    10.255.19.85: ncclInternalError: Internal check failed.
    10.255.19.85: Last error:
    10.255.19.85: Bootstrap : no socket interface found

     

    其实这三个错误都是一个问题导致的,就是网卡配置的问题

    这是之前的配置

    hostfile

     

    10.255.19.82 slots=8
    10.255.19.85 slots=8

     

    fine-tune.sh

     

    复制代码
    hostfile="/data2/xinyuuliu/Baichuan2-main/fine-tune/hostfile"
    
    export NCCL_SOCKET_IFNAME=enp194s0f0
    # export MASTER_ADDR=10.255.19.82   # 主节点的IP地址
    # export MASTER_PORT=29500
    # --include localhost:0,1,2,3,4,5,6,7
    export NCCL_DEBUG=INFO
    # export NCCL_IB_TIMEOUT=22
    # export NCCL_IB_GID_INDEX=3
    # export NCCL_IB_TC=128
    # export NCCL_IB_DISABLE=1
    
    deepspeed --master_addr 10.255.19.82 --master_port 29500 --hostfile=$hostfile fine-tune.py  \
        --report_to "none" \
        --data_path "/data2/xinyuuliu/Baichuan2-main/fine-tune/data/全网评价总结训练数据.json" \
        --model_name_or_path "/data1/xinyuuliu/Baichuan2-13B-Chat" \
        --output_dir "output_lora_summary" \
        --model_max_length  10000\
        --num_train_epochs 10 \
        --per_device_train_batch_size 4 \
        --gradient_accumulation_steps 1 \
        --save_strategy epoch \
        --learning_rate 2e-4 \
        --lr_scheduler_type constant \
        --adam_beta1 0.9 \
        --adam_beta2 0.98 \
        --adam_epsilon 1e-8 \
        --max_grad_norm 1.0 \
        --weight_decay 1e-4 \
        --warmup_ratio 0.0 \
        --logging_steps 1 \
        --gradient_checkpointing True \
        --deepspeed ds_config.json \
        --bf16 True \
        --tf32 True \
        --use_lora True \
        # --load_lora_path /data2/xinyuuliu/Baichuan2-main/fine-tune/output_lora4_1_1/checkpoint-7516
        # --use_NEFT True
        # --use_frozen True
    
     #"/data2/xinyuuliu/baichuan2_7B"
    复制代码

     

     

    修改后之后的配置

    问题主要出现在 NCCL_SOCKET_IFNAME 这个环境变量,这个环境变量会被携带到其他机器上,但是网卡的名称是不一样的,尤其我的两台机器包含很多的网卡,因此,我们配置的时候需要把那些没用的虚拟网卡屏蔽掉,只留下需要的

    解决方法,这个要根据实际情况来改,英伟达官方写法如下,屏蔽显卡用^开头

    export NCCL_SOCKET_IFNAME=^br-c485a8390817,docker0,eno2,ens6f0,ens6f1,enx46a838614d5f,lo,veth23d7383,br-dcd3e4ec14e7,enp194s0f1,ens6f0,ens6f1,enxe278666d5a52,veth110d0b7,veth215ea4e,veth3203d6b,veth87c3cbf,vethec6fc79,virbr0
    
    

     我的网卡太多了,之前一直以为环境变量在 /etc/profile 下配置各自的就行,

    然后再source /etc/profile,结果发现不对,从机也都指向了主机的网卡,没办法建立socket

    
    

     

     

    复制代码
    hostfile="/data2/xinyuuliu/Baichuan2-main/fine-tune/hostfile"
    
    export NCCL_SOCKET_IFNAME=^br-c485a8390817,docker0,eno2,ens6f0,ens6f1,enx46a838614d5f,lo,veth23d7383,br-dcd3e4ec14e7,enp194s0f1,ens6f0,ens6f1,enxe278666d5a52,veth110d0b7,veth215ea4e,veth3203d6b,veth87c3cbf,vethec6fc79,virbr0
    # export NCCL_SOCKET_IFNAME=enp194s0f0
    # export MASTER_ADDR=10.255.19.82   # 主节点的IP地址
    # export MASTER_PORT=29500
    # --include localhost:0,1,2,3,4,5,6,7
    export NCCL_DEBUG=INFO
    # export NCCL_IB_TIMEOUT=22
    # export NCCL_IB_GID_INDEX=3
    # export NCCL_IB_TC=128
    # export NCCL_IB_DISABLE=1
    
    deepspeed --master_addr 10.255.19.82 --master_port 29500 --hostfile=$hostfile fine-tune.py  \
        --report_to "none" \
        --data_path "/data2/xinyuuliu/Baichuan2-main/fine-tune/data/全网评价总结训练数据.json" \
        --model_name_or_path "/data1/xinyuuliu/Baichuan2-13B-Chat" \
        --output_dir "output_lora_summary" \
        --model_max_length  10000\
        --num_train_epochs 10 \
        --per_device_train_batch_size 4 \
        --gradient_accumulation_steps 1 \
        --save_strategy epoch \
        --learning_rate 2e-4 \
        --lr_scheduler_type constant \
        --adam_beta1 0.9 \
        --adam_beta2 0.98 \
        --adam_epsilon 1e-8 \
        --max_grad_norm 1.0 \
        --weight_decay 1e-4 \
        --warmup_ratio 0.0 \
        --logging_steps 1 \
        --gradient_checkpointing True \
        --deepspeed ds_config.json \
        --bf16 True \
        --tf32 True \
        --use_lora True \
        # --load_lora_path /data2/xinyuuliu/Baichuan2-main/fine-tune/output_lora4_1_1/checkpoint-7516
        # --use_NEFT True
        # --use_frozen True
    
     #"/data2/xinyuuliu/baichuan2_7B"
    复制代码

    修改后成功跑起16*H100,爽歪歪

     

     

     

     

  • 相关阅读:
    每日面试题- 前言+java基础篇(1)面向对象
    ElasticSearch学习(Part One,语法学习)
    使用OAK-D相机跑ORB-SLAM3算法遇到的问题总结
    机器学习之数据准备
    Flink 重启策略和故障恢复策略
    字节5年经验之谈 —— Selenium 中并行测试的重要性!
    使用easyexcel模板导出的两个坑(Map空数据列错乱和不支持嵌套对象)
    Java Web中requset,session,application 的作用域及区别
    SwiftUI Preview传递参数问题
    将 ChatGLM2-6B 部署成 OpenAI API 服务
  • 原文地址:https://www.cnblogs.com/LiuXinyu12378/p/18144455