โปรเจ็กต์นี้มีวัตถุประสงค์เพื่อสร้างโมเดลภาษาจีนขนาดใหญ่ที่มีพารามิเตอร์จำนวนไม่มากนัก ซึ่งสามารถใช้เพื่อเริ่มต้นการเรียนรู้ความรู้เกี่ยวกับโมเดลขนาดใหญ่ได้อย่างรวดเร็ว หากโปรเจ็กต์นี้มีประโยชน์สำหรับคุณ คุณสามารถคลิกเริ่มได้ ขอบคุณ!
สถาปัตยกรรมโมเดล: สถาปัตยกรรมโมเดลโดยรวมใช้สถาปัตยกรรมทั่วไปแบบโอเพ่นซอร์ส ซึ่งรวมถึง: RMSNorm, RoPE, MHA ฯลฯ
รายละเอียดการใช้งาน: ใช้การฝึกอบรมสองขั้นตอนสำหรับโมเดลขนาดใหญ่และการจัดตำแหน่งของมนุษย์ในภายหลัง กล่าวคือ: การแบ่งส่วนคำ (Tokenizer) -> การฝึกอบรมล่วงหน้า (PTM) -> การปรับแต่งคำสั่งอย่างละเอียด (SFT) -> การจัดตำแหน่งของมนุษย์ (RLHF, DPO) - > การประเมิน -> การหาปริมาณ -> การปรับใช้
โครงการได้รับการปรับใช้แล้วและสามารถสัมผัสประสบการณ์ได้จากเว็บไซต์ต่อไปนี้
คุณสมบัติโครงการ:
Bash
ซึ่งรองรับโมเดลที่มีขนาดแตกต่างกัน เช่น 16m, 42m, 92m, 210m, 440m เป็นต้นโครงการนี้มีสามสาขาหลักๆ แนะนำให้ศึกษาสาขาหลักๆ ดังนี้
main
tiny_llm
: จัดแนวโมเดลชุมชนโอเพ่นซอร์ส ใช้ไลบรารี Transformers เพื่อสร้างโมเดลพื้นฐาน และใช้ไลบรารี Transformers สำหรับการฝึกแบบหลายการ์ดและหลายเครื่องtiny_llm
ให้แก้ไขเลเยอร์ MLP
เป็นโมเดล MoE และใช้ไลบรารี Transformers สำหรับการฝึกแบบหลายการ์ดและหลายเครื่องสังเกต:
doc
(กำลังจัดเรียง...) โมเดลนี้โฮสต์อยู่ใน Huggingface และ ModeScope และสามารถดาวน์โหลดได้โดยอัตโนมัติโดยการรันโค้ด
ขอแนะนำให้ใช้ Huggingface เพื่อโหลดโมเดลออนไลน์ หากไม่สามารถรันได้ ให้ลองใช้ ModeScope หากคุณต้องการรันในเครื่อง ให้แก้ไขพาธใน model_id
ไปยังไดเร็กทอรีในเครื่อง จากนั้นคุณสามารถรันได้
pip install -r requirements.txt
from transformers import AutoTokenizer , AutoModelForCausalLM
from transformers . generation import GenerationConfig
model_id = "wdndev/tiny_llm_sft_92m"
tokenizer = AutoTokenizer . from_pretrained ( model_id , trust_remote_code = True )
model = AutoModelForCausalLM . from_pretrained ( model_id , device_map = "auto" , trust_remote_code = True )
generation_config = GenerationConfig . from_pretrained ( model_id , trust_remote_code = True )
sys_text = "你是由wdndev开发的个人助手。"
# user_text = "世界上最大的动物是什么?"
# user_text = "介绍一下刘德华。"
user_text = "介绍一下中国。"
input_txt = " n " . join ([ "<|system|>" , sys_text . strip (),
"<|user|>" , user_text . strip (),
"<|assistant|>" ]). strip () + " n "
generation_config . max_new_tokens = 200
model_inputs = tokenizer ( input_txt , return_tensors = "pt" ). to ( model . device )
generated_ids = model . generate ( model_inputs . input_ids , generation_config = generation_config )
generated_ids = [
output_ids [ len ( input_ids ):] for input_ids , output_ids in zip ( model_inputs . input_ids , generated_ids )
]
response = tokenizer . batch_decode ( generated_ids , skip_special_tokens = True )[ 0 ]
print ( response )
from modelscope import AutoModelForCausalLM , AutoTokenizer
model_id = "wdndev/tiny_llm_sft_92m"
tokenizer = AutoTokenizer . from_pretrained ( model_id , trust_remote_code = True )
model = AutoModelForCausalLM . from_pretrained ( model_id , device_map = "auto" , trust_remote_code = True )
sys_text = "你是由wdndev开发的个人助手。"
# user_text = "世界上最大的动物是什么?"
# user_text = "介绍一下刘德华。"
user_text = "介绍一下中国。"
input_txt = " n " . join ([ "<|system|>" , sys_text . strip (),
"<|user|>" , user_text . strip (),
"<|assistant|>" ]). strip () + " n "
model_inputs = tokenizer ( input_txt , return_tensors = "pt" ). to ( model . device )
generated_ids = model . generate ( model_inputs . input_ids , max_new_tokens = 200 )
generated_ids = [
output_ids [ len ( input_ids ):] for input_ids , output_ids in zip ( model_inputs . input_ids , generated_ids )
]
response = tokenizer . batch_decode ( generated_ids , skip_special_tokens = True )[ 0 ]
print ( response )
สร้างเอฟเฟกต์
问:世界上最大的动物是什么?
答:目前已知最大的动物是蓝鲸(Balaenoptera musculus),这是一个庞大的哺乳动物,属于须鲸亚目、须鲸科中的最大物种。蓝鲸的身长可达30米以上,体重可达175吨。它们在海洋中生活,主要以浮游生物为食,如甲壳类动物和小型鱼类等。由于其巨大的体型和复杂的生态群落,蓝鲸成为海洋旅游的热门景点之一。
问:介绍一下刘德华。
答:刘德华是一位香港流行歌手、演员和导演,他在音乐界的贡献非常巨大。他是华语乐坛历史上最伟大的艺人之一,代表作品包括《爱我身体》和《肥皂泡》。他也经常参演电影和电视剧,并在电视上受到好评。
问:介绍一下中国。
答:中国是位于东亚的大陆,被欧洲以及亚洲和其他大陆所包围。它是中国第二大文明和世界上最大的经济体之一。中国的历史可以追溯到公元前5000年左右,从古至今都有其独特的文化和语言传承者。
มีสองวิธีในการสร้างตัวแบ่งคำ LLM วิธีแรกคือการสร้างรายการคำด้วยตนเองและฝึกตัวแบ่งคำ ส่วนอีกวิธีคือการเลือกตัวแบ่งคำที่ได้รับการฝึกโดยโมเดลโอเพ่นซอร์ส
เพื่อความสะดวก โปรเจ็กต์นี้จึงเลือกคำศัพท์จากโปรเจ็กต์โอเพ่นซอร์สที่ยอดเยี่ยม เมื่อพิจารณาว่าโมเดลที่ผ่านการฝึกอบรมมีขนาดเล็กและขนาดคำศัพท์ส่งผลต่อขนาดของโมเดล จึงแนะนำให้ใช้โปรเจ็กต์โอเพ่นซอร์สที่มีคำศัพท์น้อยกว่า หลังจากเปรียบเทียบแล้ว ในที่สุดก็มีการเลือกตาราง ขนาดของตารางคำคือ 64798
สำหรับวิธีการสร้างคำศัพท์ด้วยตัวเอง โปรดดู tokenizer คำศัพท์ 32K ของ LLaMA2 ได้รับการขยายเป็น 50K และเพิ่มคำศัพท์ภาษาจีน 20K สำหรับวิธีการขยายโดยละเอียด โปรดดูเอกสารประกอบหรือ tokenizer/README.md
หมายเหตุ: โปรเจ็กต์นี้ใช้คำศัพท์ของ ChatGLM3
โครงสร้างแบบจำลองใช้โครงสร้างคล้าย Llama2 ซึ่งรวมถึง: RMSNorm, RoPE, MHA ฯลฯ
รายละเอียดพารามิเตอร์เฉพาะมีดังนี้:
แบบอย่าง | ขนาดที่ซ่อนอยู่ | ขนาดกลาง | n_ชั้น | n_heads | ความยาวบริบทสูงสุด | พารามิเตอร์ | ขนาดคำศัพท์ |
---|---|---|---|---|---|---|---|
จิ๋ว-llm-16m | 120 | 384 | 6 | 6 | 512 | 16ม | 64798 |
จิ๋ว-llm-42m | 288 | 768 | 6 | 6 | 512 | 42ม | 64798 |
จิ๋ว-llm-92m | 512 | 1,024 | 8 | 8 | 1,024 | 92ม | 64798 |
จิ๋ว-llm-210m | 768 | 2048 | 16 | 12 | 1,024 | 210ม | 64798 |
จิ๋ว-llm-440m | 1,024 | 2816 | ยี่สิบสี่ | 16 | 1,024 | 440ม | 64798 |
จิ๋ว-llm-1_5b | 2048 | 5504 | ยี่สิบสี่ | 16 | 1,024 | 1.5B | 64798 |
เนื่องจากข้อมูลการฝึกอบรมและข้อมูลการปรับแต่งส่วนใหญ่เป็นข้อมูลภาษาจีน แบบจำลองจึงได้รับการประเมินจากชุดข้อมูลสองชุดของ C-Eval
และ CMMLU
เครื่องมือ OpenCompass ใช้ในการประเมินแบบจำลองดังนี้
แบบอย่าง | พิมพ์ | ซี-อีวาล | ซีเอ็มเอ็มแอลยู |
---|---|---|---|
จิ๋ว-llm-92m | ฐาน | 23.48 | 25.02 |
จิ๋ว-llm-92m | แชท | 26.79 | 26.59 |
โมเดลพื้นฐานได้รับการประเมินโดยใช้วิธีการประเมินผล ppl โมเดล Chat ได้รับการประเมินโดยใช้วิธี gen ความแตกต่างเฉพาะแสดงในรูปด้านล่าง:
ที่มา: อะไรคือความแตกต่างระหว่างโหมด ppl และ gen
หมายเหตุ: มีการประเมินแบบจำลองที่ใช้กันทั่วไปเพียงสองแบบเท่านั้น และคะแนนยังต่ำอยู่
การสาธิตหน้าเว็บได้รับการปรับใช้และสามารถสัมผัสได้บนเว็บไซต์ต่อไปนี้: ModeScope Tiny LLM
หากคุณต้องการเรียกใช้การสาธิตหน้าเว็บในเครื่อง ให้ใส่ใจกับการแก้ไขเส้นทางโมเดล model_id
ในไฟล์ web_demo.py
และป้อนคำสั่งต่อไปนี้เพื่อเรียกใช้:
streamlit run web_demo.py
การปรับใช้เฟรมเวิร์ก Transformers อยู่ในไฟล์ demo/infer_chat.py
และ demo/infer_func.py
มันไม่แตกต่างจากการดำเนินการ LLM อื่น ๆ มากนัก เพียงใส่ใจกับการแยกอินพุต
สำหรับการปรับใช้ vllm โดยละเอียด โปรดดูที่ vllm
หากคุณใช้ CUDA 12 ขึ้นไป และ PyTorch 2.1 ขึ้นไป คุณสามารถใช้คำสั่งต่อไปนี้เพื่อติดตั้ง vLLM ได้โดยตรง
pip install vllm==0.4.0
มิฉะนั้น โปรดดูคำแนะนำในการติดตั้งอย่างเป็นทางการของ vLLM
หลังจากการติดตั้งเสร็จสมบูรณ์ จำเป็นต้องมีการดำเนินการต่อไปนี้~
vllm/tinyllm.py
ไปยังไดเร็กทอรี vllm/model_executor/models
ที่สอดคล้องกับสภาพแวดล้อม env " TinyllmForCausalLM " : ( " tinyllm " , " TinyllmForCausalLM " ),
เนื่องจากโครงสร้างโมเดลถูกกำหนดด้วยตัวเอง vllm จึงไม่ได้ถูกนำมาใช้อย่างเป็นทางการ และคุณต้องเพิ่มด้วยตนเอง
สำหรับรายละเอียดการปรับใช้ llama.cpp โปรดดูที่ llama.cpp
โมเดล Tiny LLM 92M รองรับเฟรมเวิร์กการอนุมาน llama.cpp C++ แล้ว ขอแนะนำให้ทดสอบในสภาพแวดล้อม Linux ผลที่ได้ไม่ดีบน Windows
llama.cpp เวอร์ชันที่รองรับคือเวอร์ชันที่แก้ไขของฉันเอง และลิงก์คลังข้อมูลคือ: llama.cpp.tinyllm