Deepspeed 结合huggingface Trainer实现多机分布式训练

目前工作中只使用了单机多卡做微调训练,为了提升训练效率,特实验多机多卡分布式训练。

一、环境准备

本试验使用两台机器(manager,worker),操作系统ubuntu 22.4,每台机器有4个GPU

为了使安装配置统一,使用docker容器,docker 的安装这里不做介绍。

1.网络配置-创建overlay共享网络

初始化集群,在manager机器上运行:

docker swarm init

#输出结果:
Swarm initialized: current node (k4ehuhg4a2umpjoo7yovy1caf) is now a manager.

To add a worker to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-686yitjn5p5twd3b3pzezqofd8dlk1wm6juqo3xb5bj4xzztvh-15obj4grc8p8mqul8qvmupkdi 192.168.11.11:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

加入集群,在worker机器上运行:

docker swarm join --token SWMTKN-1-686yitjn5p5twd3b3pzezqofd8dlk1wm6juqo3xb5bj4xzztvh-15obj4grc8p8mqul8qvmupkdi 192.168.11.11:2377

在 manager 中创建 overlay 网络,执行命令:

docker network create --driver=overlay --attachable test-net

执行命令docker network ls查看当前网络状态,可以看到最后一行,已经创建好了

NETWORK ID     NAME                      DRIVER    SCOPE
ec8c853e521d   bridge                    bridge    local
72574615b63f   docker_gwbridge           bridge    local
9fbe2f6c3b22   freeaskinternet_default   bridge    local
b8273bdcc836   host                      host      local
ii71ul2agult   ingress                   overlay   swarm
eadcc6c24a81   none                      null      local
fxnzpd6r1hr0   sharednet                 overlay   swarm
wdoj2fcw29np   test-net                  overlay   swarm

2.安装docker-compose

sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/bin/docker-compose
sudo chmod +x /usr/bin/docker-compose
docker-compose --version

3.创建工作目录work

mkdir work
cd work

4.在work中创建文件,Dockerfile

#Dockerfile

from nvcr.io/nvidia/cuda:12.2.0-devel-ubuntu22.04

# 更新系统包
RUN apt-get update && apt-get install -y git build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libsqlite3-dev libreadline-dev libffi-dev liblzma-dev libbz2-dev curl wget net-tools iputils-ping pdsh

# 安装Python
WORKDIR /home/user

RUN wget https://www.python.org/ftp/python/3.10.6/Python-3.10.6.tgz && \
  tar -zvxf Python-3.10.6.tgz && cd Python-3.10.6 && \
  ./configure --enable-optimizations &&
### 使用 Hugging Face Trainer 进行模型训练 #### 准备工作 为了利用 `Trainer` 模块进行模型的微调,首先需要安装必要的库并导入所需的模块。通常情况下,这涉及到安装 Transformers 库以及可能使用的 Datasets 和 Evaluate 库。 ```bash pip install transformers datasets evaluate ``` 接着,在 Python 脚本或 Jupyter Notebook 中引入这些包: ```python from transformers import AutoTokenizer, AutoModelForSequenceClassification, TrainingArguments, Trainer import numpy as np from datasets import load_dataset, load_metric ``` #### 数据处理 对于自定义的数据集来说,应该先将其转换成适合输入给定预训练模型的形式。这里以情感分析为例说明如何准备数据集[^1]。 ```python raw_datasets = load_dataset("imdb") # 假设使用IMDB电影评论作为例子 tokenizer = AutoTokenizer.from_pretrained('bert-base-cased') def preprocess_function(examples): return tokenizer(examples['text'], truncation=True) tokenized_datasets = raw_datasets.map(preprocess_function, batched=True) small_train_dataset = tokenized_datasets["train"].shuffle(seed=42).select([i for i in list(range(0, 100))]) small_eval_dataset = tokenized_datasets["test"].shuffle(seed=42).select([i for i in list(range(0, 100))]) ``` #### 定义评估指标 为了让 `Trainer` 可以计算验证期间的表现情况,还需要指定评价标准。比如可以采用准确率来衡量二元分类的效果。 ```python metric = load_metric("accuracy") def compute_metrics(eval_pred): logits, labels = eval_pred predictions = np.argmax(logits, axis=-1) return metric.compute(predictions=predictions, references=labels) ``` #### 设置训练参数 创建一个 `TrainingArguments` 实例用于配置训练的具体选项,如批量大小、学习率等超参设置。 ```python training_args = TrainingArguments( output_dir="./results", evaluation_strategy="epoch", learning_rate=2e-5, per_device_train_batch_size=8, per_device_eval_batch_size=8, num_train_epochs=3, weight_decay=0.01, ) ``` #### 初始化 Trainer 对象 最后一步就是实例化 `Trainer` 类,并传入之前定义好的组件——包括模型架构、优化器参数、训练/测试数据集以及性能度量函数。 ```python model = AutoModelForSequenceClassification.from_pretrained('bert-base-cased', num_labels=2) trainer = Trainer( model=model, args=training_args, train_dataset=small_train_dataset, eval_dataset=small_eval_dataset, compute_metrics=compute_metrics ) ``` 此时已经准备好启动训练过程了! ```python trainer.train() ``` 上述代码展示了基于 BERT 的序列分类任务(即情感分析),但同样的方法也适用于其他类型的 NLP 问题,只需调整相应的模型结构和前处理逻辑即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值