Datawhale AI夏令营-多模态大模型数据合成Task1 学习笔记

Task1 学习笔记

注意:这是一篇助教的笔记,可能与学习者的范围有所出入!

Part 1: 这波高端局

本期方向难度较高(后面修正为高)。原因有以下几点:

  1. 本赛事需要耗费大量的算力,跑通此baseline至少需要120G内存以上的A10

  2. 如果没有足够的本地资源,则需要通过租用算力解决,需要有一定的经济基础

我们正在为了控制时间和金钱成本而努力着。

整个学习活动应当实现的目标:

  • 跑通最简单的Baseline

  • 了解竞赛核心考察点和难点

  • 精读Baseline与了解进阶思路

一开始教程贡献者准备写“零基础入门”,后来看到耗费时间达到300分钟后还是算了。

Part 2: 实践过程与方案修正

由于助教从8月8日便开始了对方案的测试,因此和baseline目前的版本不同,此处将会从阿里云最原始的方案开始并一步步修正到正式的版本。

工欲善其事,必先利其器。在实现项目之前,必须先配置好运行环境。

因此,第一件事便是安装好Conda并生成对项目专用的虚拟环境

conda create -n dj python=3.10 # 创建一个名为dj的虚拟环境,它的Python版本为3.10
conda init bash # 将Conda的shell初始化为bash
conda activate dj # 正式进入到虚拟环境中

然后就是开发工具的安装了,这里一共分为3个板块:

  • install.sh,负责下载所有的开发依赖,主要负责的下载工具为pip和git。
  • download.sh,负责下载官方提供的数据。
  • model_download.sh, 负责下载提供的预训练模型。

这里创建好dj虚拟环境后就可以让项目安家落户了。

git clone https://www.modelscope.cn/datasets/Datawhale/better_synth_baseline.git

此时better_synth_baseline所包含的所有文件就已经进入到本地刚生成好的better_synth_baseline目录中了。进入工作目录并先运行install.sh以安装所有的开发依赖:

bash install.sh

关于install.sh

此处先梳理一下install.sh的流程:

  1. 先从github上将data-juicer克隆下来
  2. 然后通过pip根据依赖以及依赖编译构建所需的依赖按顺序进行下载安装。 

data-juicer是我们本次要使用到的重要工具

Data-Juicer系统采用细粒度的数据处理流程抽象,内置了50多个可自由组合和扩展的运算符。它通过集成可视化和自动评估功能,形成了数据处理和LLM训练的闭环。此外,Data-Juicer还与LLM训练、评估和分布式计算生态系统无缝集成,为LLM的数据中心研究提供了强大支持。

接下来会用到它的地方有:dj-process

由于install.sh中没有报错退出的代码,因此无论中间是否发生错误,install.sh均会运行到最后。所以在运行install.sh的时候不能掉以轻心,一定要确认整个中间过程没有报错再继续!

关于download.sh

download.sh负责下载官方提供的数据集,在部分数据集中存在需要进入前面已经下载并解压生成的文件夹中操作,和install.sh同理,一定要注意每一个环节不能出错!

然后就是对于其中内容的研究,一开始采用的是wget命令进行文件的传输,但是由于网络环境不理想,wget很多次都失败了。同时,wget默认参数下并不会断点续传,所以目录中经常因为失败的下载产生一大堆同名的文件,要想分辨完整体只能看大小。我可没功夫计算md5!

为了改进这一举措,将wget加上参数-c,使其支持断点续传。

可这不能治本,我需要更快的下载速度!因此,可能需要考虑多线程并行下载了。

因此,选择将wget换成axel以实现多线程下载

apt install axel

然后在保持下载地址不变的情况下,将wget -c改为

axel -n 5

 以实现5个线程的并行下载,但是在实际体验的过程中,当某一个线程作业结束后,会重新请求下载链接导致原有速度被重置。此时中断后重新开始下载可以缓解这种情况。

最后等.st后缀的文件和原有文件合二为一时,下载结束。

关于model_download.py 

model_download.py则是通过python下载预训练的模型并存储到本地。

这里要注意的是不同环境下的预训练模型需要进去确认一下文件缓存的路径

以阿里云为例,应该是/mnt/workspace开头。不然后面正式训练时会找不到模型的!

不过,这个地方需要从modelscope上下载,因为huggingface因为某些原因打不开。

因此需要安装modelspace的相关依赖

pip install modelscope

前期准备总结

由于云终端的限制,shell的信息到了一定程度后会自动清理,因此两个shell脚本一定是要时刻关注的!

同时,由于研究download.sh时没有注意到第一行对于环境变量的设定,导致我误下了一整份官方数据集到工作区 /mnt/workspace之外了,希望阿里云会自己清理掉。

最后统计,100G的存储空间我一共花了98G,要想训练顺利,必须要扩容了

同时为了确保所有人最基础的命令不会缺失,索性在创建虚拟环境并进入后将所有需要的工具命令一并输入。

apt update
apt install axel zip file # zip 和 file 是给install.sh和download.sh用的
pip install modelscope

数据合成阶段

data-juicer,启动!

扩容完毕后,重新启动实例,然后开始使用data-juicer工具进行数据的生成。

conda activate dj # 这个习惯动作很重要!
cd /mnt/workspace/better_synth_baseline
dj-process --config solution/image_captioning.yaml

image_captioning.yaml是data-juicer本次操作的配置文件,其中有同学提出合成时间太久。

所以,可以考虑在 image_captioning.yaml中的对应行改成这样

NP = 2

启用多线程并行,也可以往大了调,只要硬件设备允许。 

训练 & 推理评测

回到原项目目录中,启动训练的脚本

bash train_mgm_2b_stage_one_card.sh

等一下,原版脚本这样做是会爆显存的!为了确保我们已有的条件可以运行,我们需要对这个训练脚本的参数做出修改。

在保证乘积不变的情况下,将batchsize修改为2以降低显存的消耗。

然后就是3~4个小时的等待,啊,这是金钱的味道。

打包构建符合提交要求的zip文件

better_synth_root_dir=/mnt/workspace/ # 设置环境变量以方便后续的操作,相关代码可在download.sh中找到相似的。

cd submit

cp -r ${better_synth_root_dir}/better_synth_challenge_baseline/solution .

cp -r ${better_synth_root_dir}/better_synth_challenge_baseline/output/eval_results output/

cp -r ${better_synth_root_dir}/better_synth_challenge_baseline/output/train.sh output/

cp ${better_synth_root_dir}/better_synth_challenge_baseline/output/training_dirs/MGM-2B-Finetune-*/finetuning.log output/training_dirs/MGM-2B-Finetune-image_recaption/

cp ${better_synth_root_dir}/better_synth_challenge_baseline/output/training_dirs/MGM-2B-Pretrain-*/pretrain.log output/training_dirs/MGM-2B-Pretrain-image_recaption/

zip -r submit.zip solution output # 之前下载的zip将在此处派上用场。

 好了,接下来将submit.zip下载到本地并提交到官风评测,最后得到了一个比预期好的成绩,还行

Part 3: 问题与解决方案

问题1: conda环境的必要性

为什么说在进入了实例之后,运行一遍

conda activate dj

很重要呢?因为base环境早已经将python版本更新到3.12了,只有高版本兼容低版本,反之不存在。那我们在base环境下运行install.sh时将会出现报错,因为找不到对应的版本了。

冷知识:IDA Pro 8.3版本因为早期不支持python 3.12导致虽然不影响正常使用,但是一启动就会有个报错贴脸。

可见版本管理是有多么地重要。

而这个时候我们助教看到了也只会将他的截图重新编辑一下然后发回给学习者看。

(base)root@autodl-container-***********:

 上面就是base环境,而变成

(dj)root@autodl-container-***********:

才是正确的环境。 

解决方案

只要一进入实例就运行

conda activate dj

或者写一个脚本

#!/bin/bash

conda activate dj

然后,将它变成开机启动

systemctl enable switch_to_dj.sh

 

 

问题2: 依赖安装失败造成的连锁反应

这个地方的报错并不包括忘记切换环境造成的版本不匹配!

这里主要指的是部分只能从GitHub上拉取的依赖,由于网络原因,它们甚至下载整整两天都没下完!

说的就是你,flash-attn!

pip install flash-attn --no-build-isolation

一运行就编译,构建,然后卡死在那里直到实例太久没操作被自动关机,你无敌了!

解决方案

运行上面这个命令,然后钓鱼,等一段时间后pip命令自行终止报错,此时我们会发现它的报错信息中会出现一它想获取的whl文件。那我们直接本地下载再上传,这样就可以直接免去编译和拉取的动作了,一步到位。

小样,我云上开不了OpenConnect加速还不能本地开吗?

是的,你没看错,我还真试过在阿里云的服务器上开启代理,事实证明他们不是呆子。

问题3: 官方模型太短小无力怎么办?

在正式的数据训练上,我们一定会遇到以下报错信息:

Token indices sequence length is longer than the specified maximum sequence length for this model (2057 > 2048). Running this sequence through the model will result in indexing errors

这是官方模型的问题,不是我们的问题,有问题比赛规则也不允许我们去改。

解决方案 

顺其自然,不管它。 

Part 4: 总结复盘

为什么不能换源?

根据计算机网络知识,我们目前的Internet主要通过各个ISP连接,对等的ISP直接进行数据传输。但是,上游的ISP由于需要汇聚下层ISP的数据,承载更大的压力,因此会向下方的ISP要求结算。

即我们向ISP购买上网服务,下层ISP向上层ISP购买数据流通服务。

实际上,受制于信道维护的成本,在我国,不同省市的ISP同样需要进行跨省结算,即使它们是对等的。然后它们开始想着节省成本,尽量不让数据外流……

ISP看向PCDN服务商,就像猎杀看见拿滋崩打他的狗。

"我看有的人要大难临头了。"

而云服务商的业务,基础设施遍布世界各地,这也就说明若按照正常通信结算,他们需要一路收到最顶层ISP的账单,这很明显是不划算的。

所以,云服务商们组建了新类型的ISP——内容提供商网络。它们选择直接与下层ISP对接以节省线路以及ISP结算的成本。

以Google为例,它的内容提供商网络遍布全球,同时也获得了部分通信基础设施,导致Google的绝大多数结算成本都不会被人捞油水。结果在爱优腾以及Bilibili都在亏损的今天,Youtube却能年年正收入。

尤其是运行了镜像站业务的云服务商,要是别人用着他的服务却用着其他厂商的源。先不说二者之间结算的事情,这个商业口碑可以说是败光了。

所以,我知道清华源,中科大源都很好,可阿里云就是不让换。

我能怎么办~怎么办~ 

为什么网络波动大?

现在在网络安全的一个比较重要的时期,网络上的流量很乱,各地都收紧了流量审计。我所在地区的网连游戏加速器的连接都会被直接掐断。

其实我就是上传个笔记的图片都不太行……

同时,GitHub连不上那是正常现象,但我也没想到阿里云对这方面的支持也不太行。

Part 5: 参考

《计算机网络:自顶向下方法》

《TensorFlow 深度学习》

《Data-Juicer: A One-Stop Data Processing System for Large Language Models 》

《Datawhale: 从零入门多模态大模型数据合成》

  • 20
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值