Dieses Projekt zielt darauf ab, ein großes chinesisches Sprachmodell mit einer kleinen Anzahl von Parametern zu erstellen, mit dem Sie schnell mit dem Erlernen von Kenntnissen über große Modelle beginnen können. Wenn dieses Projekt für Sie nützlich ist, können Sie auf „Starten“ klicken.
Modellarchitektur: Die Gesamtmodellarchitektur übernimmt die allgemeine Open-Source-Architektur, einschließlich: RMSNorm, RoPE, MHA usw.
Implementierungsdetails: Implementieren Sie ein zweistufiges Training großer Modelle und eine anschließende menschliche Ausrichtung, nämlich: Wortsegmentierung (Tokenizer) -> Vortraining (PTM) -> Feinabstimmung der Anweisungen (SFT) -> menschliche Ausrichtung (RLHF, DPO) - > Auswertung -> Quantifizierung -> Einsatz.
Das Projekt wurde umgesetzt und kann auf der folgenden Website erlebt werden.
Projektmerkmale:
Bash
-Skript gestartet und unterstützen Modelle unterschiedlicher Größe, z. B. 16 m, 42 m, 92 m, 210 m, 440 m usw.;Dieses Projekt besteht hauptsächlich aus drei Zweigen. Es wird empfohlen, den Hauptzweig zu studieren. Die spezifischen Unterschiede sind wie folgt:
main
tiny_llm
: Richten Sie das Open-Source-Community-Modell aus, verwenden Sie die Transformers-Bibliothek zum Erstellen des zugrunde liegenden Modells und verwenden Sie die Transformers-Bibliothek auch für das Training mit mehreren Karten und mehreren Maschinen.tiny_llm
, ändern Sie MLP
Ebene in ein MoE-Modell und verwenden Sie die Transformers-Bibliothek für das Training mit mehreren Karten und mehreren Maschinen.Beachten:
doc
(wird sortiert ...). Das Modell wird in Huggingface und ModeScope gehostet und kann durch Ausführen von Code automatisch heruntergeladen werden.
Es wird empfohlen, Huggingface zu verwenden, um das Modell online zu laden. Wenn es nicht ausgeführt werden kann, versuchen Sie es mit ModeScope. Wenn Sie es lokal ausführen müssen, ändern Sie den Pfad in model_id
und Sie können es ausführen.
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 )
Effekte erzeugen
问:世界上最大的动物是什么?
答:目前已知最大的动物是蓝鲸(Balaenoptera musculus),这是一个庞大的哺乳动物,属于须鲸亚目、须鲸科中的最大物种。蓝鲸的身长可达30米以上,体重可达175吨。它们在海洋中生活,主要以浮游生物为食,如甲壳类动物和小型鱼类等。由于其巨大的体型和复杂的生态群落,蓝鲸成为海洋旅游的热门景点之一。
问:介绍一下刘德华。
答:刘德华是一位香港流行歌手、演员和导演,他在音乐界的贡献非常巨大。他是华语乐坛历史上最伟大的艺人之一,代表作品包括《爱我身体》和《肥皂泡》。他也经常参演电影和电视剧,并在电视上受到好评。
问:介绍一下中国。
答:中国是位于东亚的大陆,被欧洲以及亚洲和其他大陆所包围。它是中国第二大文明和世界上最大的经济体之一。中国的历史可以追溯到公元前5000年左右,从古至今都有其独特的文化和语言传承者。
Es gibt zwei Möglichkeiten, einen LLM-Wortsegmentierer zu erstellen: Eine besteht darin, selbst eine Wortliste zu erstellen und einen Wortsegmentierer zu trainieren. Die andere besteht darin, einen durch ein Open-Source-Modell trainierten Wortsegmentierer auszuwählen.
Der Einfachheit halber wählt dieses Projekt Vokabular aus hervorragenden Open-Source-Projekten aus. Da das trainierte Modell klein ist und die Vokabulargröße die Größe des Modells beeinflusst, werden Open-Source-Projekte mit kleinerem Vokabular bevorzugt Wird schließlich eine Tabelle ausgewählt, beträgt die Größe der Worttabelle 64798.
Informationen zur eigenen Erstellung eines Vokabulars finden Sie unter tokenizer. Der 32K-Vokabular von LLaMA2 wird auf 50K erweitert, und ein 20K-Chinesisch-Vokabular wird hinzugefügt. Weitere Informationen zu den Erweiterungsmethoden finden Sie in der Dokumentation oder in tokenizer/README.md.
Hinweis: Dieses Projekt verwendet das Vokabular von ChatGLM3.
Die Modellstruktur nimmt eine Llama2-ähnliche Struktur an, einschließlich: RMSNorm, RoPE, MHA usw.;
Die spezifischen Parameterdetails lauten wie folgt:
Modell | versteckte Größe | mittlere Größe | n_layers | n_heads | maximale Kontextlänge | Parameter | Vokabelgröße |
---|---|---|---|---|---|---|---|
winzig-lm-16m | 120 | 384 | 6 | 6 | 512 | 16M | 64798 |
tiny-llm-42m | 288 | 768 | 6 | 6 | 512 | 42M | 64798 |
tiny-llm-92m | 512 | 1024 | 8 | 8 | 1024 | 92M | 64798 |
tiny-lm-210m | 768 | 2048 | 16 | 12 | 1024 | 210M | 64798 |
winzig-lm-440m | 1024 | 2816 | vierundzwanzig | 16 | 1024 | 440M | 64798 |
tiny-llm-1_5b | 2048 | 5504 | vierundzwanzig | 16 | 1024 | 1,5B | 64798 |
Da es sich bei den meisten Trainingsdaten und Feinabstimmungsdaten um chinesische Daten handelt, wird das Modell anhand der beiden Datensätze C-Eval
und CMMLU
bewertet. Die Bewertungsergebnisse lauten wie folgt:
Modell | Typ | C-Bewertung | CMMLU |
---|---|---|---|
tiny-llm-92m | Base | 23.48 | 25.02 |
tiny-llm-92m | Chatten | 26.79 | 26.59 |
Das Basismodell wird mit der ppl-Bewertungsmethode bewertet; das Chat-Modell wird mit der gen-Methode bewertet. Die spezifischen Unterschiede sind in der folgenden Abbildung dargestellt:
Quelle: Was ist der Unterschied zwischen ppl- und gen-Modus?
Hinweis: Es wurden nur zwei häufig verwendete Modelle bewertet, und die Ergebnisse sind niedrig. Die Bewertung der übrigen Modelle ist von geringer Aussagekraft.
Die Webseiten-Demo wurde bereitgestellt und kann auf der folgenden Website erlebt werden: ModeScope Tiny LLM
Wenn Sie die Webseiten-Demo lokal ausführen möchten, achten Sie darauf, den Modellpfad model_id
in der Datei web_demo.py
zu ändern, und geben Sie zum Ausführen den folgenden Befehl ein:
streamlit run web_demo.py
Die Bereitstellung des Transfomers-Frameworks befindet sich in den Dateien demo/infer_chat.py
und demo/infer_func.py
. Es unterscheidet sich nicht wesentlich von anderen LLM-Vorgängen.
Eine detaillierte vllm-Bereitstellung finden Sie unter vllm
Wenn Sie CUDA 12 oder höher und PyTorch 2.1 oder höher verwenden, können Sie vLLM direkt mit dem folgenden Befehl installieren.
pip install vllm==0.4.0
Andernfalls lesen Sie bitte die offiziellen Installationsanweisungen von vLLM.
Nach Abschluss der Installation sind die folgenden Vorgänge erforderlich~
vllm/tinyllm.py
in vllm/model_executor/models
das der Env-Umgebung entspricht. " TinyllmForCausalLM " : ( " tinyllm " , " TinyllmForCausalLM " ),
Da die Modellstruktur von Ihnen selbst definiert wird, ist vllm nicht offiziell implementiert und muss manuell hinzugefügt werden.
Eine detaillierte Bereitstellung von llama.cpp finden Sie unter llama.cpp
Das Tiny LLM 92M-Modell unterstützt bereits das C++-Inferenzframework llama.cpp. Es wird empfohlen, es in der Linux-Umgebung zu testen. Der Effekt ist unter Windows nicht gut.
Die unterstützte Version von llama.cpp ist meine eigene modifizierte Version und der Warehouse-Link lautet: llama.cpp.tinyllm