
โครงการนี้ขึ้นอยู่กับโมเดล Mixtral-8x7b ที่เผยแพร่โดย Mistral และคาดว่าจะส่งเสริมการศึกษาแบบจำลอง MOE โดยชุมชนการประมวลผลภาษาธรรมชาติจีน รายการคำศัพท์ที่ขยายตัวของเราปรับปรุงประสิทธิภาพการเข้ารหัสและการถอดรหัสของแบบจำลองของจีนอย่างมีนัยสำคัญและดำเนินการฝึกอบรมก่อนการฝึกอบรมที่เพิ่มขึ้นของโมเดลรายการคำศัพท์ที่ขยายตัวผ่านคลังโอเพ่นซอร์สขนาดใหญ่
เนื้อหาโอเพ่นซอร์สของโครงการ:
โปรดทราบว่า Chinese-Mixtral-8x7b อาจยังคงสร้างคำตอบที่ทำให้เข้าใจผิดที่มีข้อผิดพลาดจริงหรือเนื้อหาที่เป็นอันตรายที่มีอคติ/การเลือกปฏิบัติ โปรดระมัดระวังในการระบุและใช้เนื้อหาที่สร้างขึ้นและไม่กระจายเนื้อหาที่เป็นอันตรายที่สร้างขึ้นไปยังอินเทอร์เน็ต
โครงการนี้ได้รับการฝึกฝนโดยใช้ Qlora น้ำหนัก LORA และแบบจำลองน้ำหนักรวมเป็นโอเพ่นซอร์สตามลำดับ คุณสามารถเลือกที่จะดาวน์โหลดตามความต้องการของคุณ:
| ชื่อนางแบบ | ขนาดรุ่น | ดาวน์โหลดที่อยู่ | คำพูด |
|---|---|---|---|
| Chinese-Mixtral-8x7b | 88GB | กอด ModelsCope | สามารถใช้โมเดลรายการคำภาษาจีนที่สมบูรณ์ได้โดยตรง |
| Adapter จีน-Mixtral-8x7b | 2.7GB | กอด | น้ำหนัก LORA จะต้องรวมเข้ากับ MixTRAL-8X7B ดั้งเดิมก่อนที่จะสามารถใช้งานได้ โปรดดูสคริปต์ผสานที่นี่ |
Chinese-Mixtral-8x7b รองรับระบบนิเวศแบบจำลอง MixTral-8x7B ที่สมบูรณ์รวมถึงการใช้ vLLM และ Flash Attention 2 สำหรับการเร่งความเร็วโดยใช้ bitsandbytes สำหรับการหาปริมาณแบบจำลอง ฯลฯ นี่คือตัวอย่างโค้ดสำหรับการใช้เหตุผลโดยใช้ภาษาจีน Mixtral-8x7b
ใช้ Flash Attention 2:
import torch
from transformers import AutoModelForCausalLM , AutoTokenizer
model_id = "HIT-SCIR/Chinese-Mixtral-8x7B"
tokenizer = AutoTokenizer . from_pretrained ( model_id )
model = AutoModelForCausalLM . from_pretrained ( model_id , attn_implementation = "flash_attention_2" , torch_dtype = torch . bfloat16 , device_map = "auto" )
text = "我的名字是"
inputs = tokenizer ( text , return_tensors = "pt" ). to ( 0 )
outputs = model . generate ( ** inputs , max_new_tokens = 20 )
print ( tokenizer . decode ( outputs [ 0 ], skip_special_tokens = True ))ปริมาณโดยใช้ 4 บิต:
import torch
from transformers import AutoModelForCausalLM , AutoTokenizer
model_id = "HIT-SCIR/Chinese-Mixtral-8x7B"
tokenizer = AutoTokenizer . from_pretrained ( model_id )
model = AutoModelForCausalLM . from_pretrained ( model_id , load_in_4bit = True , device_map = "auto" )
text = "我的名字是"
inputs = tokenizer ( text , return_tensors = "pt" ). to ( 0 )
outputs = model . generate ( ** inputs , max_new_tokens = 20 )
print ( tokenizer . decode ( outputs [ 0 ], skip_special_tokens = True ))โปรดทราบว่า Chinese-Mixtral-8x7b เป็นรุ่นพื้นฐานและไม่ได้รับการปรับแต่งตามคำแนะนำดังนั้นความสามารถในการปฏิบัติตามคำสั่งจึงมี จำกัด คุณสามารถอ้างถึงส่วนการปรับแต่งเพื่อปรับแต่งโมเดล
เราใช้ชุดข้อมูลการประเมินผลต่อไปนี้เพื่อประเมิน Chinese-Mixtral-8x7b แยกกัน:
ตามรายงานทางเทคนิคที่เผยแพร่โดย Mistral MixTral-8x7b จะเปิดใช้งานพารามิเตอร์ 13B เมื่อการอนุมาน ตารางต่อไปนี้แสดงผลลัพธ์ 5 ช็อตของจีน -Mixtral-8x7b และแบบจำลองการขยายคำภาษาจีนขนาด 13B อื่น ๆ ในชุดข้อมูลการประเมินผลแต่ละชุด:
| ชื่อนางแบบ | วัสดุการฝึกอบรมที่เพิ่มขึ้น | C-eval (ชาวจีน) | cmmlu (ชาวจีน) | mmlu (ภาษาอังกฤษ) | Hellaswag (ภาษาอังกฤษ) |
|---|---|---|---|---|---|
| IDEA-CCNL/ZIYA2-13B-BASE | โทเค็น 650B | 59.29 | 60.93 | 59.86 | 58.90 |
| TigerResearch/TigerBOT-13B-BASE-V3 | โทเค็น 500B | 50.52 | 51.65 | 53.46 | 59.16 |
| LINLY-AI/Chinese-LLAMA-2-13B-HF | โทเค็น 11b | 42.57 | 41.95 | 51.32 | 59.05 |
| HFL/Chinese-llama-2-13b | โทเค็นประมาณ 30B (120GB) | 41.90 | 42.08 | 51.92 | 59.28 |
| Chinese-Mixtral-8x7b (โครงการนี้) | โทเค็น 42b | 52.08 | 51.08 | 69.80 | 65.69 |
ในแง่ของความรู้และความเข้าใจของจีนความสามารถในการใช้งานจีน-มิกซ์ทัล-8x7b ของเราเปรียบได้กับประสิทธิภาพ TigerBot-13b-base-V3 เนื่องจากจำนวนข้อมูลการฝึกอบรมของจีน-มิกซ์ทรา-8x7b เป็นเพียง 8% ของ TigerBot-13b-base-V3 รุ่นของเรายังคงมีที่ว่างสำหรับการปรับปรุงเพิ่มเติม ในเวลาเดียวกันด้วยประสิทธิภาพที่ทรงพลังของโมเดล Mixtral-8x7b ดั้งเดิมต้นฉบับของเรา Mixtral-8x7b ของเราได้ถึงระดับภาษาอังกฤษที่แข็งแกร่งที่สุดของแต่ละรุ่นรายการคำ
เนื่องจากความแตกต่างเล็กน้อยในรายละเอียดการใช้งานของสคริปต์การประเมินผลในเวอร์ชันที่แตกต่างกันเพื่อให้แน่ใจว่าความสอดคล้องและความเป็นธรรมของผลการประเมินผลสคริปต์การประเมินผลของเราใช้ LM-Evaluation-Harness ที่ปล่อยออกมาโดย Eleutherai และ Hash Hash คือ 28ec7fa
ตารางต่อไปนี้แสดงเอฟเฟกต์การสร้างของแบบจำลองการขยายคำแต่ละคำ เนื่องจากคลังข้อมูลที่ผ่านการฝึกอบรมมาก่อนของบางรุ่นไม่ได้คั่นด้วย eos_token เราจึงใช้ max_tokens = 100 เพื่อตัดข้อความที่สร้างขึ้น พารามิเตอร์การสุ่มตัวอย่างของเราคือ temperature = 0.8, top_p = 0.9

สำหรับการเข้ารหัสและการถอดรหัสของจีนเราใช้คำว่า spegmenter ของแต่ละรุ่นคำศัพท์เพื่อเข้ารหัสชุดข้อมูล Skypile (2023-06_ZH_HEAD_HAD_0000.JSONL) และเปรียบเทียบเอาท์พุทโทเค็นข้อความภาษาจีน
| ชื่อนางแบบ | หมวดหมู่รุ่น | ขนาดคำศัพท์ | ปริมาณโทเค็นในข้อความภาษาจีน | ประสิทธิภาพของตัวแปลงสัญญาณ |
|---|---|---|---|---|
| meta-llama/llama-2-13b-hf | ลาม่า | 32000 | 780m | ต่ำ |
| Mistralai/Mixtral-8x7b-v0.1 | มิกซ์ | 32000 | 606m | ต่ำ |
| LINLY-AI/Chinese-LLAMA-2-13B-HF | ลาม่า | 40076 | 532m | กลาง |
| IDEA-CCNL/ZIYA2-13B-BASE | ลาม่า | 39424 | 532m | กลาง |
| HFL/Chinese-llama-2-13b | ลาม่า | 55296 | 365m | สูง |
| TigerResearch/TigerBOT-13B-BASE-V3 | ลาม่า | 65112 | 342m | สูง |
| Chinese-Mixtral-8x7b (โครงการนี้) | มิกซ์ | 57000 | 355m | สูง |
ในบรรดาข้อความทดสอบที่ประมาณ 1.4GB ประสิทธิภาพของตัวแปลงสัญญาณจีนจีน-8x7b ของเรานั้นเป็นอันดับสองรองจาก TigerBOT-13B-BASE-V3 ซึ่งสูงกว่ารุ่นเดิม 41.5% สิ่งนี้เอื้อต่อการเร่งความเร็วในการอนุมานของตำราภาษาจีนและประหยัดความยาวลำดับในสถานการณ์เช่นการเรียนรู้ในบริบทและห่วงโซ่ของความคิดซึ่งเอื้อต่อการปรับปรุงประสิทธิภาพของงานการอนุมานที่ซับซ้อน
เราใช้ sentencepiece เพื่อฝึกอบรมคำศัพท์ BPE จีนในข้อมูล 12G Zhihu และข้อมูลการตรัสรู้ 2G เมื่อฝึกอบรมรายการคำศัพท์เราระบุจำนวนโทเค็นคำเดียวของจีนและจำนวนโทเค็นจีนทั้งหมดและรวมทั้งสองเพื่อรับรายการคำศัพท์หลายร้อยรายการที่มีขนาดและเนื้อหาที่แตกต่างกัน เพื่อให้ได้รายการคำศัพท์ที่เหมาะสมที่สุดเราคำนวณความสามารถในการใช้คำศัพท์ภาษาจีนของรายการคำศัพท์เหล่านี้ผ่าน ALP ที่เสนอโดย Zheng Bo et al ALP เป็นตัวบ่งชี้ที่สะดวกและรวดเร็วในการวัดความสามารถในการใช้คำศัพท์ของภาษาที่เฉพาะเจาะจงโดยการคำนวณความละเอียดของคำย่อยในภาษาที่เฉพาะเจาะจงและลงโทษคำย่อยความถี่กลางและต่ำของรายการคำศัพท์
เราประเมินค่า ALP สำหรับรายการคำศัพท์ที่แตกต่างกันในหนังสือและสารานุกรมคลังข้อมูล ในภาพประกอบสี่เส้นโค้งแสดงรายการคำของโทเค็นคำเดียวของจีนสี่ใบ (4451, 5435, 6414 และ 7434) เพื่อหลีกเลี่ยงอัตราการบีบอัดของจีนที่มีขนาดเล็กเกินไปและเลเยอร์การฝังที่กระจัดกระจายเกินไปเราเลือกจุดผันของเส้นโค้ง ALP ซึ่งจะเพิ่มโทเค็นจีน 25,000 รายการในรายการคำศัพท์ บนพื้นฐานนี้เราเลือก ALP ที่ใหญ่ที่สุดในสี่เส้นโค้งนั่นคือรายการคำศัพท์ของโทเค็นคำเดียว 6414 ของจีนถูกเพิ่มเข้ามาเป็นรายการคำศัพท์สุดท้ายที่เลือกโดย Chinese-Mixtral-8x7b

หลังจากได้รับคำศัพท์ใหม่เราจำเป็นต้องขยายและเริ่มต้นเลเยอร์การฝังและเลเยอร์ LM_HEAD เราเริ่มต้นการขยายตัวโดยใช้คำว่าการฝังค่าเฉลี่ยของโทเค็นใหม่ในเลเยอร์ฝังตัวเก่า ในการทดลองก่อนหน้านี้ของเราวิธีการนี้ดีกว่าการใช้งานเริ่มต้นของ HuggingFace เล็กน้อยเช่นการเริ่มต้นจะดำเนินการโดยใช้การแจกแจงแบบปกติคงที่
รุ่น MixTRAL-8X7B มีปริมาตรพารามิเตอร์ 46.7B การฝึกอบรมพารามิเตอร์เต็มรูปแบบต้องใช้กลยุทธ์แบบขนานหลายแบบในเวลาเดียวกัน ค่าใช้จ่ายเวลาสูงเกินไปเมื่อทรัพยากรการฝึกอบรมมี จำกัด ดังนั้นเราจึงใช้วิธีการที่แนะนำอย่างเป็นทางการโดย HuggingFace เพื่อฝึกอบรมแบบจำลองโดยใช้ Qlora จากการสลายตัวระดับต่ำของ LORA Qlora จะช่วยลดหน่วยความจำวิดีโอที่จำเป็นสำหรับการฝึกอบรมและรักษาประสิทธิภาพให้เทียบกับการฝึกอบรมแบบเต็มพารามิเตอร์โดยการแนะนำปริมาณ 4 บิตการหาปริมาณแบบคู่และการใช้หน่วยความจำ Unified NVIDIA สำหรับการเพจ
เราอ้างถึงการตั้งค่าของ LORA โดย Yiming Cui และคณะใช้การสลายตัวระดับต่ำกับเลเยอร์เชิงเส้นทั้งหมดของแบบจำลองดั้งเดิมและตั้งค่าพารามิเตอร์ของเลเยอร์การฝังตัวที่ขยายและเลเยอร์ LM_HEAD สำหรับร่างกายแบบจำลองเราใช้รูปแบบ NF4 สำหรับการหาปริมาณซึ่งสามารถทำให้ข้อมูลเชิงปริมาณมีการกระจายข้อมูลเช่นเดียวกับก่อนการวัดปริมาณและการสูญเสียข้อมูลน้ำหนักของโมเดลน้อยลง
เราขอแนะนำให้ใช้ Python 3.10 + Torch 2.0.1
# Pytorch + Transformers
$ pip install torch==2.0.1 torchvision==0.15.2 torchaudio==2.0.2
$ pip install transformers==4.36.2 datasets evaluate peft accelerate gradio optimum sentencepiece trl
$ pip install jupyterlab scikit-learn pandas matplotlib tensorboard nltk rouge bitsandbytes fire
# CUDA Toolkit
$ conda install nvidia/label/cuda-11.7.1::cuda
# DeepSpeed
$ git clone https://github.com/microsoft/DeepSpeed.git
$ cd DeepSpeed
$ DS_BUILD_FUSED_ADAM=1 pip3 install .
# Flash Attention
$ pip install flash-attn --no-build-isolationเราได้รับการฝึกอบรมจากจีน-มิกซ์ทัล-8x7b ตามชุดข้อมูลโอเพนซอร์สที่มีอยู่ซึ่งรวมถึง:
| ชื่อชุดข้อมูล | ภาษาชุดข้อมูล | จำนวนข้อมูลที่ใช้ | คำพูด |
|---|---|---|---|
| Skywork/Skypile-150b | ชาวจีน | 30B | ใช้เฉพาะข้อมูลจาก 2022 + 2023 |
| dkyoon/slimpajama-6b | ภาษาอังกฤษ | 12b | ชุดข้อมูลการทำสำเนา 2 Epoch |
ดาวน์โหลดชุดข้อมูลลงใน data ผ่าน data/download.py สำหรับชุดข้อมูล Slimpajama คุณต้องใช้ data/parquet2jsonl.py เพื่อแปลงชุดข้อมูลต้นฉบับเป็นรูปแบบ jsonl
ชุดข้อมูลที่ดาวน์โหลดมานั้นเป็นเศษของไฟล์ JSONL หลายไฟล์ ใช้ cat เพื่อรวมหลายเศษเป็นไฟล์ JSONL หนึ่งไฟล์
$ cat * .jsonl > all.jsonl split JSONL เป็นคอลเล็กชันรถไฟและคอลเลกชันที่ถูกต้อง อัตราส่วนของรถไฟและสายที่ถูกต้องในโครงการนี้คือ 999: 1
$ wc -l all.jsonl # 计算数据集总行数
$ split -l < lines > all.jsonl # 按999:1计算train/valid行数,进行切分
$ mv xaa DKYoon-SlimPajama-6B-train.jsonl # 重命名
$ mv xab DKYoon-SlimPajama-6B-dev.jsonl ลงทะเบียนชื่อชุดข้อมูลและพา ธ ไปยัง data/datasets.toml :
[ DKYoon-SlimPajama-6B ] # 数据集名称
splits = [ " train " , " dev " ] # 数据集train/valid集合
root = " {DATA_DIR}/en/{name} " # 数据集根目录
doc = " {name}-{split} " # 数据集文件名
encoded = " encoded-{name}-{split} " # 预处理保存位置ใช้ data/preprocess_datasets.py ไปยังเซ็กเมนต์ subword เซ็กเมนต์ชุดข้อมูลเพื่อเพิ่มความเร็วในการฝึกอบรม
$ python data/preprocess_datasets.py --ds_name SkyPile-150B-2023 --tokenizer_name_or_path tokenizer/Mixtral-8x7B-v0.1-vocab
$ python data/preprocess_datasets.py --ds_name DKYoon-SlimPajama-6B --tokenizer_name_or_path tokenizer/Mixtral-8x7B-v0.1-vocab หลังจากดำเนินการแบ่งส่วนคำย่อยคุณสามารถใช้ data/utils.py เพื่อดูโทเค็นทั้งหมดของแต่ละชุดข้อมูล:
$ python data/utils.py สคริปต์เริ่มต้นการฝึกอบรมคือ scripts/train.sh ชุดข้อมูลการฝึกอบรมและชุดข้อมูลสามารถแก้ไขได้โดยการปรับเปลี่ยน TRAIN_DATASETS :
TRAIN_DATASETS=(
1:SkyPile-150B-2022 # 使用全量SkyPile-150B-2022
0.1:SkyPile-150B-2023 # 使用SkyPile-150B-2023的10%数据
1:DKYoon-SlimPajama-6B # 使用全量DKYoon-SlimPajama-6B
) หากคุณใช้ระบบการจัดการกลุ่ม Slurm คุณสามารถส่งผ่าน sbatch :
$ sbatch scripts/train-pt.sh หากคุณไม่มี slurm หรือต้องการเริ่มการฝึกอบรมผ่านบรรทัดคำสั่งคุณสามารถแยก torchrun โดยตรงใน scripts/train-pt.sh เพื่อเริ่มการฝึกอบรม
รูปแบบชุดข้อมูลที่จำเป็นสำหรับการปรับแต่งนั้นคล้ายกับการฝึกอบรมล่วงหน้า ไฟล์ชุดข้อมูลจะต้องอยู่ในรูปแบบ JSONL: หนึ่ง JSON ต่อบรรทัดซึ่งจำเป็นต้องมีฟิลด์ "text" และแยกคำสั่งอินพุตและเอาต์พุตตามเทมเพลตที่คุณต้องการ
จากนั้นคุณต้องลงทะเบียนชื่อชุดข้อมูลและพา ธ ไปยัง data/datasets.toml :
[ ShareGPT-Chinese ] # 数据集名称
splits = [ " train " ] # 数据集train/valid集合
root = " {DATA_DIR}/sft/{name} " # 数据集根目录
doc = " {name}-{split} " # 数据集文件名 สคริปต์เริ่มต้นการฝึกอบรมคือ scripts/train-sft.sh -sft.sh ชุดข้อมูลการฝึกอบรมและชุดข้อมูลสามารถแก้ไขได้โดยการปรับเปลี่ยน TRAIN_DATASETS :
TRAIN_DATASETS=(
1.0:ShareGPT-Chinese # 使用全量ShareGPT-Chinese
0.5:ShareGPT-English # 使用ShareGPT-English的50%数据
) หากคุณใช้ระบบการจัดการกลุ่ม Slurm คุณสามารถส่งผ่าน sbatch :
$ sbatch scripts/train-sft.sh หากคุณไม่มี slurm หรือต้องการเริ่มการฝึกอบรมผ่านบรรทัดคำสั่งคุณสามารถแยก torchrun ได้โดยตรงใน scripts/train-sft.sh เพื่อเริ่มการฝึกอบรม
หากคุณรู้สึกว่าโครงการนี้มีประโยชน์ต่อการวิจัยของคุณหรือใช้รหัสของโครงการนี้โปรดดูที่โครงการนี้:
@misc { Chinese-Mixtral-8x7B ,
author = { HIT-SCIR } ,
title = { Chinese-Mixtral-8x7B: An Open-Source Mixture-of-Experts LLM } ,
year = { 2024 } ,
publisher = { GitHub } ,
journal = { GitHub repository } ,
howpublished = { url{https://github.com/HIT-SCIR/Chinese-Mixtral-8x7B} }
}