このプロジェクトは、少数のパラメーターを使用して大規模な中国語モデルを構築することを目的としています。このプロジェクトを使用して、大規模なモデルに関する知識をすぐに学習できるようになります。このプロジェクトが役に立った場合は、[開始] をクリックしてください。
モデル アーキテクチャ: 全体的なモデル アーキテクチャは、RMSNorm、RoPE、MHA などのオープンソースの一般的なアーキテクチャを採用しています。
実装の詳細: 大規模モデルの 2 段階のトレーニングとそれに続く人間によるアライメントを実装します。つまり、単語セグメンテーション (トークナイザー) -> 事前トレーニング (PTM) -> 命令微調整 (SFT) -> 人間によるアライメント (RLHF、DPO) - > 評価 -> 定量化 -> 展開。
プロジェクトは展開されており、以下のWebサイトで体験できます。
プロジェクトの特徴:
Bash
スクリプトによって開始され、16m、42m、92m、210m、440m などのさまざまなサイズのモデルをサポートします。このプロジェクトには主に 3 つのブランチがあり、具体的な違いは次のとおりです。
main
tiny_llm
: オープンソース コミュニティ モデルを調整し、Transformers ライブラリを使用して基礎となるモデルを構築し、マルチカードおよびマルチマシンのトレーニングにも Transformers ライブラリを使用します。tiny_llm
に基づいて、 MLP
レイヤーを MoE モデルに変更し、マルチカードおよびマルチマシンのトレーニングに Transformers ライブラリを使用します。知らせ:
doc
フォルダーを参照してください (ソート中...) モデルは Huggingface と ModeScope でホストされており、コードを実行することで自動的にダウンロードできます。
モデルをオンラインでロードするには、Huggingface を使用することをお勧めします。モデルをローカルで実行する必要がある場合は、 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 単語セグメンターを構築するには 2 つの方法があります。1 つは自分で単語リストを作成し、単語セグメンターをトレーニングする方法です。もう 1 つは、オープンソース モデルによってトレーニングされた単語セグメンターを選択する方法です。
便宜上、このプロジェクトでは優れたオープンソース プロジェクトから語彙を選択しています。学習済みのモデルが小さく、語彙のサイズがモデルのサイズに影響することを考慮すると、比較すると語彙が小さいオープンソース プロジェクトが優先されます。最終的にテーブルが選択された場合、ワードテーブルのサイズは64798です。
自分で語彙を構築する方法については、トークナイザーを参照してください。LLaMA2 の 32K 語彙が 50K に拡張され、20K の中国語語彙が追加されます。詳細な拡張方法については、ドキュメントまたは tokenizer/README.md を参照してください。
注: このプロジェクトでは ChatGLM3 のボキャブラリーを使用します。
モデル構造は、RMSNorm、RoPE、MHA などを含む Llama2 のような構造を採用しています。
特定のパラメータの詳細は次のとおりです。
モデル | 隠れたサイズ | 中間サイズ | n_layers | n_heads | コンテキストの最大長 | パラメータ | 語彙サイズ |
---|---|---|---|---|---|---|---|
tiny-llm-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-llm-210m | 768 | 2048年 | 16 | 12 | 1024 | 210M | 64798 |
tiny-llm-440m | 1024 | 2816 | 24 | 16 | 1024 | 440M | 64798 |
tiny-llm-1_5b | 2048年 | 5504 | 24 | 16 | 1024 | 1.5B | 64798 |
トレーニング データと微調整データのほとんどは中国のデータであるため、モデルはC-Eval
とCMMLU
の 2 つのデータ セットで評価されます。評価スコアは次のとおりです。
モデル | タイプ | C-評価 | CMMLU |
---|---|---|---|
tiny-llm-92m | ベース | 23.48 | 25.02 |
tiny-llm-92m | チャット | 26.79 | 26.59 |
Base モデルは ppl 評価メソッドを使用して評価され、Chat モデルは gen メソッドを使用して評価されます。具体的な違いを以下の図に示します。
出典: ppl モードと gen モードの違いは何ですか
注: 一般的に使用される 2 つのモデルのみが評価されており、残りのモデルの評価はあまり重要ではありません。
Web ページのデモが展開されており、次の Web サイトで体験できます: ModeScope Tiny LLM
Web ページのデモをローカルで実行する場合は、 web_demo.py
ファイル内のモデル パスmodel_id
変更に注意し、次のコマンドを入力して実行します。
streamlit run web_demo.py
Transfomers フレームワークのデプロイメントは、 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
ファイルを、env 環境に対応するvllm/model_executor/models
ディレクトリにコピーします。 " TinyllmForCausalLM " : ( " tinyllm " , " TinyllmForCausalLM " ),
モデル構造は自分で定義するため、vllm は正式に実装されていないため、手動で追加する必要があります。
llama.cpp の展開の詳細については、「llama.cpp」を参照してください。
Tiny LLM 92M モデルは、すでに llama.cpp C++ 推論フレームワークをサポートしています。Windows 環境では効果が不十分です。
サポートされている llama.cpp のバージョンは私が独自に修正したバージョンで、ウェアハウスのリンクは次のとおりです: llama.cpp.tinyllm