文章目录
- 写在前面
- 一. 一些名词
- 二. 基于Codet5训练自己的模型
- 理论步骤:
- 1. 安装依赖
- 2. 下载CodeT5代码库
- 3. 准备数据集
- 4. 修改训练脚本
- 5. 启动训练
- 6. 进行预测
- 具体实践
- 1. 准备数据集
- 2. 配置运行环境
- 3. 修改脚本参数
- 4. 为实现分布式训练,修改脚本
- 如何实现分布式训练?
- (1)理解分布式训练的概念:
- (2)实现分布式训练的步骤:
- (3)要修改配置文件的相关参数,首先要了解自己的电脑/服务器的GPU配置。
- 5. 配置运行环境
- 6. 启动训练
- 7. 使用模型
写在前面
本文章记录CodeT5模型的学习过程,笔者深度学习的基础较浅。
学习目标是基于CodeT5掌握基本的模型建立与模型训练知识,同时基于codet5模型训练可以自动生成go语言代码的模型。
Codet5代码库
- chatgpt是我学习模型训练的过程中最有用的工具。确实牛。以下的很多内容也都来源于chatgpt。
- 同时,本文的主要目的是记录我的学习过程。不保证我所写的内容的正确性。
- 诸多内容已标注来源。
未完。
一. 一些名词
-
fine-tune:
- What is fine-tune?
- 微调是金融和经济中用于减轻损失和经济压力的一种策略。
- 它涉及进行小的修改和改进。
- 它可以使用不同的策略来执行,例如技术分析,可以手动或使用新技术自动执行。
- What is fine-tune in deep learning?
Fine-tuning in deep learning is accomplished by combining datasets from established networks and using them efficiently by using time, money, and other resources more practically. - How to fine-tune a deep learning model?
-
transformer
参考:
(原文)http://jalammar.github.io/illustrated-transformer/
(中文版1) https://zhuanlan.zhihu.com/p/82312421
(中文版2)https://blog.csdn.net/qq_36667170/article/details/124359818
- checkpoint
Checkpoints play an important role in training long running machine learning (ML) models. Checkpoints take a snapshot of an ML model and store it in a non-volatile memory so that they can be used to recover from failures to ensure rapid train- ing progress.
应用检查点是一种用于长时间运行的进程的容错技术。
在这种方法中,在系统出现故障的情况下拍摄系统状态的快照。如果出现问题,也不会全部丢失。检查点可以直接使用,也可以作为新运行的起点,从中断的地方继续运行。
在训练深度学习模型时,检查点位于模型的权重处。这些权重可用于按原样进行预测或作为持续训练的基础。 - 迁移学习
- 预训练模型
参考: https://paddlepedia.readthedocs.io/en/latest/tutorials/pretrain_model/pretrain_model_description.html
从字面上看,预训练模型(pre-training model)是先通过一批语料进行训练模型,然后在这个初步训练好的模型基础上,再继续训练或者另作他用。这样的理解基本上是对的,预训练模型的训练和使用分别对应两个阶段:预训练阶段(pre-training)和 微调(fune-tuning)阶段。
- 编码器-解码器模型:
二. 基于Codet5训练自己的模型
理论步骤:
由于我没有训练模型的基础,所以步骤部分我直接一步步问了chatgpt,以下6个步骤是chatgpt的回答+我的总结。
里面具体的代码细节可能无法对应到具体的模型代码里(实际实践可以看下一节),但是整体步骤和思路是正确的。
1. 安装依赖
需要安装必要的依赖项,包括Python 3、TensorFlow、Git、unzip等。可以通过以下命令安装这些依赖项:
# 安装Python 3和pip
sudo apt-get update
sudo apt-get install python3 python3-pip# 安装TensorFlow和Git
pip3 install tensorflow-gpu git# 安装unzip工具
sudo apt-get install unzip
2. 下载CodeT5代码库
通过以下命令将代码库克隆到本地计算机(或者远程服务器)上:
git clone https://github.com/salesforce/CodeT5.git
3. 准备数据集
在进行训练之前,需要准备一个包含自然语言文本和对应的带有类环境的Go代码的数据集。可以将每个样本保存为一个TFRecord文件。需要确保每个TFRecord文件都包含以下特征:
- inputs: 包含一段自然语言文本和带有类环境的Go代码的输入序列。
- targets: 包含生成的Go代码的目标输出序列。
以下是一个示例数据集的目录结构
./dataset/
├── train.tfrecords
├── valid.tfrecords
└── test.tfrecords
4. 修改训练脚本
-
修改CodeT5代码库中的训练脚本
run_gen.py
。在这个脚本中,需要在各个函数中增加自定义任务的选项。 -
修改CodeT5代码库中的参数脚本
configs.py
。在这个脚本中需要配置训练参数、数据集路径、模型参数等。可以通过在代码中硬编码来指定各个参数的值,也可以在指令中指定。建议在指令中再指定,硬编码到文件里会有一些奇怪的错误(个人经验)。
可以通过以下步骤来修改脚本:
打开
CodeT5/configs.py
文件。找到以下参数,并根据需求进行修改:
- model_size: 模型的大小。可以选择"small"、“base”、“large"或"xlarge”。
- batch_size: 训练时的批量大小。
- num_train_steps: 训练时的总步数。
- learning_rate: 训练时的学习率。
- model_dir: 模型保存的路径。
- train_file_pattern: 训练数据集的路径,支持通配符。
- eval_file_pattern: 验证数据集的路径,支持通配符。
- predict_file_pattern: 测试数据集的路径,支持通配符。
- tpu_name: 如果您使用TPU训练模型,需要指定TPU的名称。
- get_dataset: 加载数据集的函数。您需要根据您的数据集格式修改该函数中的代码,以正确加载您的数据集。
- get_model_params: 获取模
5. 启动训练
运行run_gen.py
文件。
6. 进行预测
完成训练后,可以使用训练好的模型进行预测。使用以下命令来进行预测:
python3 run_codet5.py --mode=predict --predict_file_pattern=path/to/predict.tfrecords
其中,path/to/predict.tfrecords
是要进行预测的TFRecord文件的路径。预测的结果将会保存在model_dir/predictions/predictions-XXXXX.json
文件中。
具体实践
1. 准备数据集
由于codet5是使用tensorflow进行训练的(CodeT5模型的实现是基于TensorFlow 2.x框架的),所以需要将原始数据(通常存放在json文件或者csv文件中)转换为TFRecord格式。
TFRecord是一种高效的二进制文件格式,可以将多个数据样本组织在一个文件中,并且可以轻松地在训练过程中进行并行读取和解析。
具体的转换可以用python代码实现。
更新:
数据的转换在run_gen.py中已经通过
这个几行代码实现。不需要自己实现,只需指定数据的路径即可。
2. 配置运行环境
由于我是在服务器上跑模型,没有root权限,最终选择使用docker管理环境。
具体的配置过程请看我的另一篇博客:Docker学习与实战记录
3. 修改脚本参数
正如上文所说:可以通过在代码中硬编码来指定各个参数的值,也可以在指令中指定。
建议在指令中再指定,硬编码到文件里会有一些奇怪的错误(个人经验)。
-
首先要了解什么是脚本,参数是什么意思。
每个模型都需要有一个配置文件来指定训练和推断的各种参数和设置。这些配置文件通常以一种特定格式进行存储,例如YAML或JSON格式。这些格式都是轻量级的,易于阅读和编辑,并且可以很容易地转换为Python对象,以便在代码中使用。
-
在配置文件中,通常会包含以下内容:
- 模型架构的名称或路径
- 数据集的路径或URL
- 模型训练的超参数,如学习率、批大小、训练轮数等等
这里,可以了解一下模型的参数和超参数的概念。
- 参数:模型可以根据数据可以自动学习出的变量,比如,深度学习的权重,偏差等。
- 超参数:用来确定模型的一些参数,超参数不同,模型是不同的(比如说:假设都是CNN模型,如果层数不同,模型不一样,虽然都是CNN模型。)。超参数通常是在模型训练之前设置的,需要手动调整以找到最优的超参数组合,以使得模型能够在训练集和测试集上表现最佳。超参数不是通过训练数据来确定的,而是需要人为设定。
- 模型推断时的参数,如最大序列长度、生成温度等等
- 模型训练和推断的路径,如模型保存路径、日志文件路径、预测结果路径等等
通过使用配置文件,可以方便地修改和调整模型的各种参数和设置,而无需更改代码。这样可以提高代码的可维护性和灵活性。
-
通常情况下,配置文件会以YAML或JSON等结构化数据格式进行存储,因为这些格式具有良好的可读性和易于管理的特点。但是,也有一些特殊情况下,可能会使用其他格式来存储配置文件。
CodeT5原本是基于TensorFlow实现的,但是它也有一个pytorch版本的实现。这里我只使用了基于tensorflow实现的模型的配置文件。
CodeT5的配置文件,有的使用的是sh脚本的形式进行存储(
CodeT5/sh/exp_with_args.sh
),有的是使用python文件存储(CodeT5/configs.py
)。 -
为什么需要配置文件?
这是因为CodeT5的配置文件非常复杂,包含了很多不同的参数和选项,需要进行大量的数据预处理和模型训练。使用脚本可以将这些操作集成在一起,并在需要时自动运行,从而提高了效率和便利性。此外,脚本还可以通过命令行参数接收外部输入,使得配置文件更加灵活和可配置。
我初步没有对CodeT5原来的脚本进行修改。在命令行中指定。
4. 为实现分布式训练,修改脚本
更新:
- CodeT5中可以通过直接指定
--n_gpus
和--rank
参数来实现分布式训练。不需要自己再配置。 - 我之所以需要用到分布式训练是因为训练时提示我GPU容量不够,但是最后发现这个错误提示是由于我配置文件的问题(?奇怪),将配置文件恢复初始化然后自己在命令行中指定参数后,错误消失,不需要采用分布式训练。
由于我导给我分配的服务器内存不够训练模型(偷偷吐槽🤭🤭),所以需要合并两个3090来训练,为此需要修改配置文件以实现模型的分布式训练。
如何实现分布式训练?
(1)理解分布式训练的概念:
分布式训练(Distributed Training)是一种将单个深度学习模型训练任务分割成多个部分,并通过多个计算设备(如多个GPU或多个计算机)同时执行这些部分的技术。它可以显著加快深度学习模型的训练速度,提高训练效率和性能。
在传统的单机训练中,深度学习模型的所有计算任务都在单个计算设备上执行,这限制了模型的训练速度和规模。而在分布式训练中,模型训练任务被分割成多个部分,这些部分可以在多个计算设备上并行执行,从而提高了训练速度和规模。
(2)实现分布式训练的步骤:
一般而言,实现分布式训练需要以下几个步骤:
1. 设计模型架构:在设计模型架构时需要考虑分布式训练的需求,例如如何分割数据、如何定义模型参数以及如何同步模型参数等。
2. 数据准备:在进行分布式训练时,需要将数据集进行分割,并将不同部分的数据分配给不同的计算节点,以便在节点之间共享数据。通常,数据可以通过分布式存储或者分布式文件系统进行管理和存储。
3. 启动训练:启动分布式训练需要进行多个步骤,包括设置训练参数、定义节点角色、设置网络拓扑结构以及启动训练进程等。
4. 优化算法:为了获得更好的训练效果和更快的训练速度,需要对优化算法进行改进,例如采用异步梯度下降、累积梯度、压缩梯度等技术。
5. 监控和调试:在分布式训练过程中,需要对训练进程进行监控和调试,以便及时发现和解决问题,例如通过可视化工具观察训练曲线、打印日志信息等。
总体而言,分布式训练是一项复杂的任务,需要对计算、通信、优化算法等多个方面进行优化和调整,以获得更好的训练效果。
对于CodeT5这种已经实现了分布式训练的框架,设计模型架构和启动训练可以通过修改配置文件来完成,具体来说:
- 第1步设计模型架构:CodeT5的模型架构已经在代码中实现,可以在配置文件中指定模型名称和其他超参数来选择不同的模型架构,不需要修改其他文件。
- 第3步启动训练:CodeT5已经封装好了分布式训练的代码,在配置文件中可以指定使用多少个GPU进行训练,以及训练的其他超参数,不需要修改其他文件。
因此,在使用CodeT5进行分布式训练时,只需要修改配置文件即可完成模型架构和训练参数的调整。
至于第3步数据准备,可以通过随机分配的方式来划分数据,也可以通过修改配置文件来完成数据准备。具体地,可以在配置文件中设置训练集、验证集和测试集的路径,代码会读取这些路径下的数据进行训练、验证和测试。可以将数据集分成不同的文件,然后在配置文件中指定每个文件的路径,以实现数据划分。
在CodeT5中,数据准备的相关配置参数包含在configs/data_configs.py文件中。可以在该文件中修改TRAIN_FILE, VALID_FILE, TEST_FILE等参数来指定训练集、验证集和测试集的路径。如果需要进行数据增强、数据预处理等操作,也可以在该文件中设置相关参数。
(3)要修改配置文件的相关参数,首先要了解自己的电脑/服务器的GPU配置。
在终端输入nvidia-smi
可以得到关于GPU的信息。
举例学习:
当你在终端输入nvidia-smi
命令时,它将返回所有 NVIDIA GPU 设备的相关信息,包括GPU的设备编号、GPU的利用率、显存使用情况、进程占用情况等等。下面是一些关于如何解读 nvidia-smi 命令返回的信息的例子:+-----------------------------------------------------------------------------+ | NVIDIA-SMI 470.42.01 Driver Version: 470.42.01 CUDA Version: 11.4 | |-------------------------------+----------------------+----------------------+ | GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. | | | | MIG M. | |===============================+======================+======================| | 0 Tesla V100-PCIE... On | 00000000:3B:00.0 Off | 0 | | N/A 47C P0 25W / 250W | 12688MiB / 16160MiB | 0% Default | | | | N/A | +-------------------------------+----------------------+----------------------+ | 1 Tesla V100-PCIE... On | 00000000:AF:00.0 Off | 0 | | N/A 46C P0 26W / 250W | 12688MiB / 16160MiB | 0% Default | | | | N/A | +-------------------------------+----------------------+----------------------+ | 2 Tesla V100-PCIE... On | 00000000:D8:00.0 Off | 0 | | N/A 46C P0 25W / 250W | 12688MiB / 16160MiB | 0% Default | | | | N/A | +-------------------------------+----------------------+----------------------+ | 3 Tesla V100-PCIE... On | 00000000:E1:00.0 Off | 0 | | N/A 46C P0 28W / 250W | 12688MiB / 16160MiB | 0% Default | | | | N/A | +-------------------------------+----------------------+----------------------+
上面的输出表明有4个 GPU 设备,编号分别为 0, 1, 2, 3。这里给出一些有用的信息:
- Tesla V100-PCIE:GPU设备的型号名称。
- On:GPU设备是否在使用中。如果是 Off,说明这个GPU当前没有被分配给任务使用。
- Bus-Id:GPU 设备的物理位置。
- Memory-Usage:显存使用情况,第一个数字是已经被占用的显存,第二个数字是总显存。
- GPU-Util:GPU 利用率,表示 GPU 当前的计算任务占用率。
根据上面的例子,我们可以确定第一个节点的GPU设备列表为 [0, 1, 2, 3]。即,第一个节点有4个GPU设备,它们的设备编号分别为0、1、2、3。
在这里,解释一下一直提到的“节点”这个概念:
在分布式训练中,节点是指参与训练的物理或虚拟机器,每个节点都可以拥有多个GPU设备。节点可以是多台物理机器,也可以是同一台物理机器上的多个虚拟机。在节点之间通过网络通信来共同完成模型训练的任务。
5. 配置运行环境
由于我是在服务器上跑模型,没有root权限,最终选择使用docker管理环境。
具体的配置过程请看我的另一篇博客:Docker学习与实战记录
6. 启动训练
在Docker环境中,在命令行中指定各个参数启动run_gen.py
文件。
7. 使用模型
训练只得到了模型的.bin文件,但是要使用模型还需要其他的配置文件等。
由于我在训练过程中没有修改预训练模型的超参数,因此我直接copy了预训练模型的config.json。
之后将模型上传至Huggingface。这样方便调用。
使用Huggingface的步骤
参考Huggingface上传自己的模型
- 注册登陆
- 在终端中下载git lfs
apt-get install git-lfs
git lfs install
- 使用
git lfs version
查看是否下载成功 - 在Huggingface中创建model仓库
- 在终端中git clone仓库至本地
- 将训练得到的模型的.bin文件和配置文件cp至仓库中
- 上传至远程仓库
git add .
git commit -m <message>
git push
- 完成