Proyek ini bertujuan untuk membangun model bahasa Mandarin besar dengan sejumlah kecil parameter, yang dapat digunakan untuk mulai mempelajari pengetahuan tentang model besar dengan cepat. Jika proyek ini bermanfaat bagi Anda, Anda dapat mengklik mulai Terima kasih!
Arsitektur model: Arsitektur model keseluruhan mengadopsi arsitektur umum sumber terbuka, termasuk: RMSNorm, RoPE, MHA, dll.
Detail implementasi: Menerapkan pelatihan dua tahap model besar dan penyelarasan manusia selanjutnya, yaitu: segmentasi kata (Tokenizer) -> pra-pelatihan (PTM) -> penyempurnaan instruksi (SFT) -> penyelarasan manusia (RLHF, DPO) - > evaluasi -> kuantifikasi -> Penerapan.
Proyek ini telah diterapkan dan dapat dialami di situs web berikut.
Fitur proyek:
Bash
, mendukung model dengan ukuran berbeda, seperti 16m, 42m, 92m, 210m, 440m, dll.;Proyek ini terutama memiliki tiga cabang. Disarankan untuk mempelajari cabang utama. Perbedaan spesifiknya adalah sebagai berikut:
main
tiny_llm
: Menyelaraskan model komunitas sumber terbuka, menggunakan perpustakaan Transformers untuk membangun model yang mendasarinya, dan juga menggunakan perpustakaan Transformers untuk pelatihan multi-kartu dan multi-mesin;tiny_llm
, ubah lapisan MLP
menjadi model MoE, dan gunakan pustaka Transformers untuk pelatihan multi-kartu dan multi-mesin.Melihat:
doc
(sedang disortir...) Model ini dihosting di Huggingface dan ModeScope dan dapat diunduh secara otomatis dengan menjalankan kode.
Disarankan untuk menggunakan Huggingface untuk memuat model secara online. Jika tidak dapat dijalankan, coba ModeScope. Jika Anda perlu menjalankannya secara lokal, ubah jalur di model_id
ke direktori lokal dan Anda dapat menjalankannya.
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 )
Menghasilkan efek
问:世界上最大的动物是什么?
答:目前已知最大的动物是蓝鲸(Balaenoptera musculus),这是一个庞大的哺乳动物,属于须鲸亚目、须鲸科中的最大物种。蓝鲸的身长可达30米以上,体重可达175吨。它们在海洋中生活,主要以浮游生物为食,如甲壳类动物和小型鱼类等。由于其巨大的体型和复杂的生态群落,蓝鲸成为海洋旅游的热门景点之一。
问:介绍一下刘德华。
答:刘德华是一位香港流行歌手、演员和导演,他在音乐界的贡献非常巨大。他是华语乐坛历史上最伟大的艺人之一,代表作品包括《爱我身体》和《肥皂泡》。他也经常参演电影和电视剧,并在电视上受到好评。
问:介绍一下中国。
答:中国是位于东亚的大陆,被欧洲以及亚洲和其他大陆所包围。它是中国第二大文明和世界上最大的经济体之一。中国的历史可以追溯到公元前5000年左右,从古至今都有其独特的文化和语言传承者。
Ada dua cara untuk membuat segmenter kata LLM: yang pertama adalah membuat daftar kata sendiri dan melatih segmenter kata; yang lainnya adalah memilih segmenter kata yang dilatih dengan model sumber terbuka.
Demi kenyamanan, proyek ini memilih kosakata dari proyek sumber terbuka yang sangat baik. Mengingat model yang dilatih berukuran kecil dan ukuran kosakata memengaruhi ukuran model, proyek sumber terbuka dengan kosakata yang lebih kecil lebih disukai. Setelah dibandingkan, kosakata ChatGLM3 akhirnya dipilih tabel, ukuran tabel kata adalah 64798.
Untuk metode menyusun kosakata sendiri, lihat tokenizer. Kosakata 32K LLaMA2 diperluas menjadi 50K, dan 20K kosakata bahasa Mandarin ditambahkan. Untuk metode perluasan terperinci, lihat dokumentasi atau tokenizer/README.md.
Catatan: Proyek ini menggunakan kosakata ChatGLM3.
Struktur model mengadopsi struktur mirip Llama2, termasuk: RMSNorm, RoPE, MHA, dll.;
Detail parameter spesifiknya adalah sebagai berikut:
model | ukuran tersembunyi | ukuran menengah | n_lapisan | n_heads | panjang konteks maksimal | param | ukuran kosakata |
---|---|---|---|---|---|---|---|
kecil-llm-16m | 120 | 384 | 6 | 6 | 512 | 16M | 64798 |
kecil-llm-42m | 288 | 768 | 6 | 6 | 512 | 42M | 64798 |
kecil-llm-92m | 512 | 1024 | 8 | 8 | 1024 | 92M | 64798 |
kecil-llm-210m | 768 | 2048 | 16 | 12 | 1024 | 210M | 64798 |
kecil-llm-440m | 1024 | 2816 | dua puluh empat | 16 | 1024 | 440M | 64798 |
kecil-llm-1_5b | 2048 | 5504 | dua puluh empat | 16 | 1024 | 1,5B | 64798 |
Karena sebagian besar data pelatihan dan data penyesuaian adalah data Tiongkok, model dievaluasi pada dua kumpulan data C-Eval
dan CMMLU
. Alat OpenCompass digunakan untuk mengevaluasi model.
model | Jenis | C-Eval | CMMLU |
---|---|---|---|
kecil-llm-92m | Basis | 23.48 | 25.02 |
kecil-llm-92m | Mengobrol | 26.79 | 26.59 |
Model Base dievaluasi menggunakan metode evaluasi ppl; model Chat dievaluasi menggunakan metode gen. Perbedaan spesifiknya ditunjukkan pada gambar di bawah ini:
Sumber: Apa perbedaan antara mode ppl dan gen
Catatan: Hanya dua model yang umum digunakan yang telah dievaluasi, dan skornya rendah. Evaluasi terhadap model lainnya tidak terlalu signifikan.
Demo halaman web telah diterapkan dan dapat dialami di situs web berikut: ModeScope Tiny LLM
Jika Anda ingin menjalankan Demo halaman web secara lokal, perhatikan modifikasi jalur model model_id
di file web_demo.py
dan masukkan perintah berikut untuk menjalankan:
streamlit run web_demo.py
Penerapan kerangka kerja Transformers terletak di file demo/infer_chat.py
dan demo/infer_func.py
. Tidak jauh berbeda dengan operasi LLM lainnya.
Untuk penerapan vllm secara mendetail, lihat vllm
Jika Anda menggunakan CUDA 12 atau lebih tinggi dan PyTorch 2.1 atau lebih tinggi , Anda dapat langsung menggunakan perintah berikut untuk menginstal vLLM.
pip install vllm==0.4.0
Jika tidak, silakan lihat petunjuk instalasi resmi vLLM.
Setelah instalasi selesai, operasi berikut diperlukan~
vllm/tinyllm.py
ke direktori vllm/model_executor/models
yang sesuai dengan lingkungan env. " TinyllmForCausalLM " : ( " tinyllm " , " TinyllmForCausalLM " ),
Karena struktur model ditentukan sendiri, vllm tidak diimplementasikan secara resmi dan Anda perlu menambahkannya secara manual.
Untuk penerapan llama.cpp secara mendetail, lihat llama.cpp
Model Tiny LLM 92M sudah mendukung kerangka inferensi llama.cpp C++. Disarankan untuk menguji di lingkungan Linux. Efeknya tidak baik di Windows;
Versi llama.cpp yang didukung adalah versi modifikasi saya sendiri, dan tautan gudangnya adalah: llama.cpp.tinyllm