chathub 0.1.0
Implementation of the LLaMA language model

# LLaMa Lora

可能是世界上最简单的 fintune 大模型方案，基于 llama finetune 一个 lora 模型，只需要 100 行代码。模型定义非常简单，单卡就能训练（24G），
此外，本仓库也支持中文增强的多语言模型 finetune，以及垂类文本训练。更多的 RLHF 正在增加中。

核心特色包括：

- 同时支持 transformers 的 LLaMa 以及 Open-LLaMa，后者可商用；
- 同时支持 Lora 微调以及全量微调，全量微调自动支持 Deepspeed zero3 offload，单卡 32G 显存可训；
- `ChatHub`支持市面上几乎所有不同模板的开源 LLM 开箱即用推理(cli 模式);
- 支持基于 Deepspeed Zero3 的推理，13B 的模型可以在单张卡上推理，损失少量速度；
- 支持 LION 优化器！占用显存更小，收敛速度更快；

我们的特色：

- 代码极其简单，小学生能懂；
- 我们支持 Apache 协议，权重可自由分发，支持商用（不包括 data）；
- 支持部署，GPTQ 量化，int8 GPU 一键服务端服务搭建，本地 webui 测试；
- 中文扩充词表，表达能力更强，上下文更广；
- 不断囊括的开源中文数据集，平衡多国语言（如日语、韩语、英语、西班牙语等）；
- 支持 Gradient accumlation 模拟大 batch 梯度回传；

此外，本仓库整理了一个`ChatHub`，在这里聚合了常用开源大模型的推理模板，例如`Chinese-Alpaca`, `BiLLa`, `BELLE` 等大模型。你可以直接通过 `model_id` 指定版本，加载对应的权重即可。目前支持的大模型：

- `Chinese Alpaca`: 词表大小：49k;
- `BiLLa`:
- `BELLE`:
- `Ziya`:

> 注：以上模型大多基于 LLaMa，并在 LLaMa 模型上扩充词表，但不能商用。本仓库支持 LLaMa，也支持 Open-LLaMa，后者可商用。

仓库原始基于：lit-llama，增进了许多更改，提供的功能包括：

- 基于开源版本 llama 实现和预训练权重（可商用）；
- 相较于原版 llama 模型，词表更大，生成的文本更丰富；
- 中文 finetune 支持，你只需要一张卡、一个脚本、一只手按 enter 键，就可以 finetune 一个中文 lora 模型。

同时对于 GPU 下 int8 的量化（int4 直接放弃，表面上精度下降不多但实际上表现差很多）。

## 雷区

现在互联网充斥着各种所谓的开源的大模型，实际上坑一个比一个大，有些代码过于古老，别问，问就是无法复现。有些压根好的版本不给你开源，有些甚至结果查到离谱，结果需要你来 debug 代码里面存在的问题。对于新手来说，避雷是非常重要的，这可以极大的节省自己的时间。

我这里把我遇到过的一些问题，有一些可能你已经知道，但其他人可能不知道，我全部记录下来，以节省大家的时间。这都是 **血与泪** 的教训。

- LoRA 权重加载，请先确保你的 lora 有保存成功。也就是在 `output_path`下面的`adapter_model.bin` 是否存在，不仅要存在，而是不能是空，这个玩意可能是空！！
- 在单卡跑要确认一下`micro_batch`，单卡最多支持 1，否则肯定 OOM；

## 依赖

我们使用 flash-attn 来加速 lora 训练。s

```
pip install flash-attn --no-build-isolation
pip install fschat
```

## 数据准备

sft 阶段用到的数据合并：

```
python scripts/concat_jsons.py ./data/jarvis_data_v0.2/
```
目前用到的数据集包括：

```
-rw-r--r-- 1 root root   45048321 Jun  6 06:45 combined_data_alpaca_gpt4_data_zh.json
-rw-r--r-- 1 root root 1532239189 Jun  6 06:18 combined_data_firefly-train-1.1M.json
-rw-r--r-- 1 root root  169146999 Jun  6 06:17 combined_data_guanaco_non_chat-utf8.json
-rw-r--r-- 1 root root    2845293 Jun  6 06:45 combined_data_human_value_alignment_instructions_part1.json
-rw-r--r-- 1 root root  124170311 Jun  6 06:45 combined_data_instruct51k.json
-rw-r--r-- 1 root root   32935873 Jun  6 06:18 combined_data_leetcode_instructions.json
-rw-r--r-- 1 root root  185242804 Jun  6 06:19 combined_data_school_math_0.25M.json
```


## Train

刚开始训练，我们从 llama 开源的底座模型开始，来 Lora 一个中文的 Instruct 模型。

```
python finetune/lora.py
```

LoRa 单卡 3090 或 V100 均能跑。

多卡训练：

```
torchrun --nnodes 1 --nproc_per_node 2  train_chat_vicuna.py --data_path instruct_chat_50k.jsonl --model_path /mnt/aigen_data/lewisjin/pretrained_models/llama-7b-hf-fixeos

torchrun --nnodes 1 --nproc_per_node 2  train_chat_vicuna.py --data_path instruct_chat_50k.jsonl --model_path /mnt/aigen_data/lewisjin/pretrained_models/llama-7b-hf-fixeos --deepspeed configs/ds_zero2_offload.json --micro_batch 2 --resume_from_checkpoint out/lora-Vicuna-chat/checkpoint-100
```

单卡训练：

```
python train_instruct_vicuna.py --data_path merge.json --model_path /mnt/aigen_data/lewisjin/pretrained_models/llama-7b-hf --resume_from_checkpoint ./out/lora-Vicuna/checkpoint-3200
```

多卡用 fastchat 训练，使用 fastchat 里面的 chat 模板：

```
torchrun --nnodes 1 --nproc_per_node 2  train_fschat_lora.py --data_path ./data/combined_data.json --model_name_or_path /mnt/aigen_data/lewisjin/pretrained_models/llama-7b-hf-fixeos --deepspeed configs/ds_zero2_offload.json --per_device_train_batch_size 1 --output_dir out/fschat_lora --deepspeed configs/ds_zero2_offload.json --fp16 --num_train_epochs 6
```

训练 3 个 epoch 差不多就可以用了，可以激发模型的潜能。

多卡训练命令(https://github.com/tloen/alpaca-lora/issues/182)：

```
OMP_NUM_THREADS=4 WORLD_SIZE=2 CUDA_VISIBLE_DEVICES=0,1 torchrun --nnodes 1 --nproc_per_node 2  train_fschat_lora_billa.py --data_path ./data/combined_data_coig_alpaca_gpt4.json --model_name_or_path /mnt/aigen_data/lewisjin/pretrained_models/BiLLa-7B-LLM_merged_06-05 --deepspeed configs/ds_zero2_offload.json --per_device_train_batch_size 1 --output_dir out/billa_lora_coig --deepspeed configs/ds_zero2_offload.json --fp16 --num_train_epochs 6
```

maybe need: `NCCL_P2P_DISABLE=1`.

finetune Lora Billa：

```
torchrun --nnodes 1 --nproc_per_node 2  train_fschat_lora_billa.py --data_path ./data/combined_data_06-06_7.json --model_name_or_path /mnt/aigen_data/lewisjin/pretrained_models/BiLLa-7B-LLM_merged_06-05/ --deepspeed configs/ds_zero2_offload.json --per_device_train_batch_size 1 --output_dir out/billa_lora_v0.2 --deepspeed configs/ds_zero2_offload.json --fp16 --num_train_epochs 9

# 数据太大可能导致内存崩溃

torchrun --nnodes 1 --nproc_per_node 2  train_fschat_lora_billa.py --data_path ./data/combined_data_06-06_4.json --model_name_or_path /mnt/aigen_data/lewisjin/pretrained_models/BiLLa-7B-LLM_merged_06-05 --deepspeed configs/ds_zero2_offload.json --per_device_train_batch_size 1 --output_dir out/fschat_lora --deepspeed configs/ds_zero2_offload.json --fp16 --num_train_epochs 9 
```

## Inference

如果你是自己训练模型，LoRA 训练之后，执行：

```
python chat_lora.py
```

即可将 lora 融合到原模型里面进行推理。

如果你直接从 hf 下载我们的预训练权重，那么可以采用 `ChatHub`下面的 `chat_cli.py`进行推理。

改脚本也支持其他诸多模型。

## 评测

为了对比其他开源模型的表现，我们提供另一个 `chathub`，这里面包含了诸多目前开源的大模型推理脚本，全部从 huggingface 即可直接加载。

可以采用 zbench 中的一些问题：

https://github.com/zhenbench/z-bench/blob/main/common.samples.csv

## Roadmap

- [ ] 中文训练支持，采用 BELLE 的 train_1.5m 中文数据；
- [ ] 词表扩充；
- [ ] K,V caching;

## Datasets

在 sft 阶段，我们囊括几乎市面上你能看到的所有开源数据，请注意：不包括一些质量不高、未经清理的数据集。总数据集达到 7.4M，囊括了包括多轮对话、指令微调、文本理解等数据。

- https://huggingface.co/datasets/P01son/instructions
- Guanaco: https://huggingface.co/datasets/JosephusCheung/GuanacoDataset
- pCLUE: https://github.com/CLUEbenchmark/pCLUE
- train3.5M_CN: https://huggingface.co/datasets/BelleGroup/train_3.5M_CN
- COIG: https://huggingface.co/datasets/BAAI/COIG
- alpaca_GPT4_zh: https://github.com/Instruction-Tuning-with-GPT-4/GPT-4-LLM
- AlpacaCode: https://huggingface.co/datasets/sahil2801/CodeAlpaca-20k
- BELEE Dialogue: https://huggingface.co/datasets/BelleGroup/generated_chat_0.4M
- BELEE train 2.5M: https://huggingface.co/datasets/BelleGroup/train_2M_CN