accelerate+deepspeed多机多卡训练的两种方法(三)

accelerate+deepspeed多机多卡训练的两种方法(三)

pdsh

pdsh是deepspeed里面可选的一种分布式训练工具。适合你有几台裸机,它的优点是只需要在一台机上运行脚本就可以,pdsh会自动帮你把命令和环境变量推送到其他节点上,然后汇总所有节点的日志到主节点。

要用pdsh前,你得自己给所有的机器配一样的环境,配ssh,把所有机器之间都通过ssh的秘钥文件设置成不需要密码登录,然后安装pdsh,准备工作就结束了。

然后是accelerate的配置文件:

compute_environment: LOCAL_MACHINE
deepspeed_config:
  deepspeed_hostfile: ./path/hostfile
  deepspeed_multinode_launcher: pdsh
  gradient_accumulation_steps: 1
  gradient_clipping: 1.0
  offload_optimizer_device: none
  offload_param_device: none
  zero3_init_flag: true
  zero3_save_16bit_model: true
  zero_stage: 3
distributed_type: DEEPSPEED
dynamo_config: {}
fsdp_config: {}
machine_rank: 0
main_process_ip: x.x.x.x(主节点的ip)
main_process_port: 21011
main_training_function: main
megatron_lm_config: {}
mixed_precision: fp16
num_machines: 2
num_processes: 16
rdzv_backend: static
same_network: true
tpu_env: []
tpu_use_cluster: false
tpu_use_sudo: false
use_cpu: false

这里需要传入一个hostfile文件:

x.x.x.x slots=8
x.x.x.x slots=8

x.x.x.x 可以是IP地址,也可以是主机hostname,slots=代表要使用的GPU数量

然后用accelerate运行你的训练脚本就可以了:

accelerate launch --config_file $config_path train.py

这样训练有个缺点,就是pdsh对tqdm支持不好,tqdm相关的日志可能没办法正常显示

standard

这个其实就是deepspeed对torchrun原生的封装,适合那种有算力池平台的环境,因为它得手动在每个节点启动你的训练脚本,还得传入不同的ip地址,如果有算力池平台就可以自动帮忙传入这些环境变量了。

accelerate配置如下:

compute_environment: LOCAL_MACHINE
deepspeed_config:
  deepspeed_multinode_launcher: standard
  gradient_accumulation_steps: 1
  gradient_clipping: 1.0
  offload_optimizer_device: none
  offload_param_device: none
  zero3_init_flag: true
  zero3_save_16bit_model: true
  zero_stage: 3
distributed_type: DEEPSPEED
downcast_bf16: 'no'
dynamo_config: {}
fsdp_config: {}
machine_rank: 0
main_training_function: main
megatron_lm_config: {}
mixed_precision: fp16
num_machines: 2
num_processes: 16
tpu_env: []
tpu_use_cluster: false
tpu_use_sudo: false
use_cpu: false

这种训练方式就不需要传入hostfile了,而是在每个节点指定自己的ip等信息,每个节点的运行脚本如下:

accelerate launch \
--config_file $config_path \
--machine_rank ${RANK} --main_process_ip ${MASTER_ADDR} --main_process_port ${MASTER_PORT} \
train.py

这种训练方式就不会有tqdm不兼容的问题了。

最后就是如果多机多卡训练很慢的话(GPU占用100%但是功率很低),很可能是你的NCCL走了socket导致的,这时候可以传入环境变量,将NCCL_NET改为IB就行了:

export NCCL_NET=IB

NCCL其他配置

全局环境变量设置:

export NCCL_NET=Socket; # 数据传输协议,如果使用IB网卡协议,则不需要配置
export NCCL_SOCKET_IFNAME=team0;  # 指定的socket协议网口,默认是eth0
export NCCL_SHM_DISABLE=1;  # 强制使用P2P协议,会自动使用IB协议或IP socket
export NCCL_SOCKET_NTHREADS=4;  # socket协议线程数,默认是1,范围1-16,数字越大数据传输越快
export NCCL_P2P_DISABLE=0;  # 关闭p2p传输,使用NVLink or PCI可配置,默认可不配置
export NCCL_IB_DISABLE=1;  # 为1表示禁用IB协议,如果使用IB则设置为0
export NCCL_DEBUG=INFO # DEBUG打印日志的等级


### 加速深度学习训练或推理 #### 使用 `torch.distributed` 实现训练 PyTorch 的 `torch.distributed` 包提供了强大的工具用于实现训练。通过该包,能够有效管理和协调分布在不同设备上的进程,从而提高训练速度。 为了初始化分布式环境,在启动程序前需设置一些环境变量,如 MASTER_ADDR 和 MASTER_PORT 来指定主节点地址和端口;WORLD_SIZE 表示参与训练的总进程数;RANK 则定义当前进程在整个集群中的唯一编号[^1]。 ```bash export MASTER_ADDR="localhost" export MASTER_PORT=12355 export WORLD_SIZE=8 # 假设有两台服务器每台四张GPU ``` 接着可以在 Python 脚本里调用 `init_process_group()` 方法完成组网配置: ```python import torch.distributed as dist dist.init_process_group(backend='nccl', init_method=f'tcp://{MASTER_ADDR}:{MASTER_PORT}', world_size=WORLD_SIZE, rank=RANK) ``` 对于模型并行化处理部分,则可通过 DataParallel 或 DistributedDataParallel 类来分配任务给各个 GPU 设备实例执行。DistributedDataParallel 更适合于大型网络结构因为其性能更优且占用内存较少。 ```python model = Model() model = nn.parallel.DistributedDataParallel(model.cuda(), device_ids=[local_rank], output_device=local_rank) ``` #### Accelerate 库简化分布式训练流程 除了官方提供的解决方案外,第方库也极大地方便了开发者实施复杂的分布式策略。例如 Hugging Face 开发的 **Accelerate** 工具可以帮助快速构建高效的分布式训练脚本而无需深入了解底层细节[^2]。 只需几行简单的命令就可以轻松切换不同的硬件平台(CPU/GPU/TPU),并且自动调整 batch size 等参数以适应可用资源数量变化情况。这使得即使是初学者也能迅速掌握如何高效利用现有计算能力来进行大规模数据集的学习任务。 #### Ray 和 VLLM 构建高性能推理系统 当涉及到实际应用时,不仅关注训练阶段的表现同样也要重视推理环节的速度与稳定性。为此可借助 **Ray** 及专为大模型设计优化过的 **VLLM** 推理引擎共同打造一套完整的生产级服务架构[^3]。 首先按照文档指引准备好所需的依赖项之后,编写一段简短的服务代码即可开启基于 RESTful API 形式的在线预测接口。这样不仅可以满足实时响应需求还能方便后续维护升级操作。 ```python from fastapi import FastAPI import uvicorn from transformers import AutoModelForCausalLM, AutoTokenizer import ray from vllm import LLMEngine app = FastAPI() @app.post("/predict/") async def predict(text: str): result = await engine.generate([text]) return {"generated_text": result} if __name__ == "__main__": tokenizer = AutoTokenizer.from_pretrained("your-model-name") model = AutoModelForCausalLM.from_pretrained("your-model-name").half().cuda() @ray.remote(num_gpus=1) class Worker: def __init__(self): self.engine = LLMEngine(model=model, tokenizer=tokenizer) workers = [Worker.remote() for _ in range(ray.available_resources()['GPU'])] engine = workers[0] uvicorn.run(app, host="0.0.0.0", port=8000) ``` 上述方案展示了从理论到实践的一系列措施用来解决环境下加速深度学习项目开发过程中遇到的各种挑战。无论是追求极致效能还是便捷易用性都能找到合适的技术选型组合方式达成目标。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值