大規模言語モデル 12 SentencePiece が LLama2 の中国語語彙を拡張

大規模言語モデルの開発可能性に疑いの余地はありませんが、中国語の大規模言語モデルを中小企業にとってより適したものにする方法は難しい問題です。モデルの選択に関しては、Baichuan などの中国製の大型モデルよりも、海外の LLama や Bloom を選択する傾向があります。その理由は、Huggingface Transformer や Microsoft の DeepSpeed など、インフラストラクチャからフレームワーク、データに至るまで海外のオープンソース資料が多いためです。 meta の LLama、Pytorch、Google の colab、TensorFlow、BERT これらの企業は、多数のオープンソース技術ツールと結果を提供しています。
海外では人材密度が高く、ビッグ言語の開発をリードしているため、優れた外国のオープンソースのビッグ言語モデルから始めるのは非常に良い方法であり、学習コストと企業の使用コストを削減できます。
ただし、外国は主に英語圏であり、中国語のサポートはあまり理想的ではありません。たとえば、元の LLaMA モデルの語彙サイズは 32K で、LLaMA 語彙内の中国語トークンは比較的少ない (わずか数百) 、一般的に使用される漢字は 3,000 あります)。LLaMA のネイティブ トークナイザー語彙には少数の漢字しか含まれていません。中国語をトークン化する場合、1 つの漢字が複数のトークンに分割されることがよくあり (2 ~ 3 つのトークンを組み合わせて 1 つの漢字にすることができます)、エンコードとデコードの効率が大幅に低下します。 。
中国の LLama ソースコードの推論を試しましたが、効果はさらに悪かったです。しかし、ゼロから学習させるのは大規模なプロジェクトです。学習前のデータセットは数 T になることが多く、コストが高すぎます。そのため、既存の優れたモデルに基づいた中国語語彙と中国語トレーニングは、中国語シーンをより適切にサポートするのに最適です。なお、多言語モデル(XLM-R、Bloomなど)の語彙サイズは25万程度であり、今後も優れたモデルが登場すると思われます。

中国語シーンの効果を高めるためには、次の 2 ~ 3 つのことを行う必要があります:
1. 中国語語彙を拡張し、中国語コーディングの効率を向上させる; 中国語コーパス上で中国語トークナイザー モデルをトレーニングし、中国語をマージするトークナイザーと LLaMA のネイティブ トークナイザーを組み合わせ、それらの語彙を組み合わせることで、最終的にマージされたトークナイザー モデルが得られます。
2. 増加した中国語の事前トレーニング データ セット (中国語-LLaMA-Alpaca は 120 GB を使用) を使用して中国語でモデルを事前トレーニングします; 3.
SFT 命令の微調整トレーニングと RLHF トレーニングを追加します

この部分的なブログは、LLama 2 の中国語語彙を拡張するために使用されます。LLaMA トークナイザーは文片を使用した BPE アルゴリズムに基づいて取得されるため、ここでも中国語モデルのトレーニングに BPE メソッドが使用されます。SentencePiece について知らない方は、まず「Big Language Model No. 10 SentencePiece」を読んでください。

1. オリジナルの LLama-2 モデルをダウンロードします。

7Bを例に挙げます

  1. まずメタのオリジナルモデルをダウンロードし、Huggingfaceアカウントを登録する必要があります
git lfs install
git clone https://huggingface.co/meta-llama/Llama-2-7b
  1. Huggingface が提供する変換スクリプトを使用して変換します。
python3 convert_llama_weights_to_hf.py --input_dir Llama-2-7b --model_size 7B --output_dir llama-2-7b-hf

Convert_llama_weights_to_hf.pyファイルは、Huggingface の Transformer オープン ソース git ライブラリに由来しています

変換処理中に protobuffer が使用されるため、
エラーが報告される場合は、次のようにインストールしてください。

LlamaConverter requires the protobuf library but it was not found in your environment. Checkout the instructions on the
installation page of its repo: https://github.com/protocolbuffers/protobuf/tree/master/python#installation and follow the ones
that match your environment. Please note that you may need to restart your runtime after installation.

次のようにprotobufferをインストールする必要があります

(venv) ➜  chinese_llama pip3 install --no-binary=protobuf protobuf

Collecting protobuf
  Downloading protobuf-4.24.3.tar.gz (383 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 383.9/383.9 kB 232.4 kB/s eta 0:00:00
  Preparing metadata (setup.py) ... done
Installing collected packages: protobuf

変換が成功すると、端末の入力情報は次のようになります。

Fetching all parameters from the checkpoint at Llama-2-7b.
Loading the checkpoint in a Llama model.
Loading checkpoint shards: 100%|███████████████████████████████████████████████████████████████| 33/33 [00:10<00:00,  3.30it/s]
Saving in the Transformers format.

変換が成功した後、2 つのフォルダーの比較は次のようになります。
ここに画像の説明を挿入します
3. 変換が成功した後、Huggingface が提供する Transformer ライブラリを使用してモデルとトークナイザーをロードできます。

from transformers import LlamaForCausalLM, LlamaTokenizer

tokenizer = LlamaTokenizer.from_pretrained("/output/path")
model = LlamaForCausalLM.from_pretrained("/output/path")

中国語トークナイザーのトレーニング

colab に基づくプロセスについては、github コード中国語語彙拡張を参照してください。

import sentencepiece as spm
# train sentencepiece model from `zhetian.txt` and makes `m.model` and `m.vocab`
# `m.vocab` is just a reference. not used in the segmentation.
spm.SentencePieceTrainer.train('--input=zhetian.txt --model_prefix=m --vocab_size=3439')
# makes segmenter instance and loads the model file (m.model)
sp = spm.SentencePieceProcessor()
sp.load('m.model')

# encode: text => id
print(sp.encode_as_pieces('叶凡经历九龙抬棺'))
print(sp.encode_as_ids('叶凡经历九龙抬棺'))

# decode: id => text
print(sp.decode_pieces(['▁', '叶', '凡', '经', '历', '九', '龙', '抬', '棺']))
print(sp.decode_ids([388, 359, 295, 606, 117]))

トークナイザーのマージ

## Add Chinese tokens to LLaMA tokenizer
llama_spm_tokens_set=set(p.piece for p in llama_spm.pieces)
print(len(llama_spm_tokens_set))
print(f"Before:{len(llama_spm_tokens_set)}")
for p in chinese_spm.pieces:
    piece = p.piece
    if piece not in llama_spm_tokens_set:
        new_p = sp_pb2_model.ModelProto().SentencePiece()
        new_p.piece = piece
        new_p.score = 0
        llama_spm.pieces.append(new_p)
print(f"New model pieces: {len(llama_spm.pieces)}")

32000
以前: 32000
新しいモデルの個数: 34816
ここにさらに 2816 個の中国語単語があることがわかります。

新しい語彙リストを保存してテストする

## Save
output_sp_dir = 'merged_tokenizer_sp'
output_hf_dir = 'merged_tokenizer_hf' # the path to save Chinese-LLaMA tokenizer
os.makedirs(output_sp_dir,exist_ok=True)
with open(output_sp_dir+'/chinese_llama.model', 'wb') as f:
    f.write(llama_spm.SerializeToString())
tokenizer = LlamaTokenizer(vocab_file=output_sp_dir+'/chinese_llama.model')

tokenizer.save_pretrained(output_hf_dir)
print(f"Chinese-LLaMA tokenizer has been saved to {output_hf_dir}")


# Test
llama_tokenizer = LlamaTokenizer.from_pretrained(model_id)
chinese_llama_tokenizer = LlamaTokenizer.from_pretrained(output_hf_dir)
print(tokenizer.all_special_tokens)
print(tokenizer.all_special_ids)
print(tokenizer.special_tokens_map)
text='''叶凡独自一人来到山前。
The primary use of LLaMA is research on large language models, including'''
print("Test text:\n",text)
print(f"Tokenized by LLaMA tokenizer:{llama_tokenizer.tokenize(text)}")
print(f"Tokenized by Chinese-LLaMA tokenizer:{chinese_llama_tokenizer.tokenize(text)}")

ここに画像の説明を挿入します中国語の語彙が増えていることがわかります。

この時点で中国語の語彙リストは拡張されましたが、語彙が拡張されるとそれに応じて埋め込みも増加するため、一から訓練する価値はありません。各トークンは、ブログ「 Big Language Model 4 - LlaMA-2 From Model to Application 」の LLama-2 凡例プロセスの図 3 の 4096 の埋め込み行列に対応します。再事前トレーニング時に、対応するトークンをロックできます。利用できないトークンにはランダムに 4096 ベクトルが割り当てられ、この組み合わせによりトレーニング プロセスがより効率的になります。

次の記事では、引き続き、国内の中国-LLaMA-Alpacaオープンソースプロジェクトにおけるモデルの事前トレーニングとモデル命令の微調整の全プロセスを詳細に説明します。

Guess you like

Origin blog.csdn.net/shichaog/article/details/133325234