diff --git a/FAQ_ja.md b/FAQ_ja.md new file mode 100644 index 00000000..1b93c51c --- /dev/null +++ b/FAQ_ja.md @@ -0,0 +1,85 @@ +# FAQ + +## インストールと環境 + +#### Flash attention 導入の失敗例 + +Flash attention は、トレーニングと推論を加速するオプションです。H100、A100、RTX 3090、T4、RTX 2080 などの Turing、Ampere、Ada、および Hopper アーキテクチャの NVIDIA GPU だけが、flash attention をサポートできます。それをインストールせずに私たちのモデルを使用することができます。 + +#### transformers のバージョンは? + +4.31.0 が望ましいです。 + +#### コードとチェックポイントをダウンロードしましたが、モデルをローカルにロードできません。どうすればよいでしょうか? + +コードを最新のものに更新し、すべてのシャードされたチェックポイントファイルを正しくダウンロードしたかどうか確認してください。 + +#### `qwen.tiktoken` が見つかりません。これは何ですか? + +これはトークナイザーのマージファイルです。ダウンロードする必要があります。[git-lfs](https://git-lfs.com) を使わずにリポジトリを git clone しただけでは、このファイルをダウンロードできないことに注意してください。 + +#### transformers_stream_generator/tiktoken/accelerate が見つかりません。 + +コマンド `pip install -r requirements.txt` を実行してください。このファイルは [https://github.com/QwenLM/Qwen-7B/blob/main/requirements.txt](https://github.com/QwenLM/Qwen-7B/blob/main/requirements.txt) にあります。 +

+ + + +## デモと推論 + +#### デモはありますか?CLI と Web UI のデモはありますか? + +はい、Web デモは `web_demo.py` を、CLI デモは `cli_demo.py` を参照してください。詳しくは README を参照してください。 + + + +#### CPU のみを使うことはできますか? + +はい、`python cli_demo.py --cpu-only` を実行すると、CPU のみでモデルと推論をロードします。 + +#### Qwen はストリーミングに対応していますか? + +`modeling_qwen.py` の `chat_stream` 関数を参照してください。 + +#### chat_stream() を使用すると、結果に文字化けが発生します。 + +これは、トークンがバイトを表し、単一のトークンが無意味な文字列である可能性があるためです。このようなデコード結果を避けるため、トークナイザのデフォルト設定を更新しました。コードを最新版に更新してください。 + +#### インストラクションとは関係ないようですが... + +Qwen-7B ではなく Qwen-7B-Chat を読み込んでいないか確認してください。Qwen-7B はアライメントなしのベースモデルで、SFT/Chat モデルとは挙動が異なります。 + +#### 量子化はサポートされていますか? + +はい、量子化は `bitsandbytes` でサポートされています。私たちは改良版の開発に取り組んでおり、量子化されたモデルのチェックポイントをリリースする予定です。 + +#### 量子化モデル実行時のエラー: `importlib.metadata.PackageNotFoundError: No package metadata was found for bitsandbytes` + +Linux ユーザの場合は,`pip install bitsandbytes` を直接実行することで解決できます。Windows ユーザの場合は、`python -m pip install bitsandbytes --prefer-binary --extra-index-url=https://jllllll.github.io/bitsandbytes-windows-webui` を実行することができます。 + +#### 長いシーケンスの処理に時間がかかる + +この問題は解決しました。コードを最新版に更新することで解決します。 + +#### 長いシーケンスの処理で不満足なパフォーマンス + +NTK が適用されていることを確認してください。`config.json` の `use_dynamc_ntk` と `use_logn_attn` を `true` に設定する必要があります(デフォルトでは `true`)。 +

+ + + +## ファインチューニング + +#### Qwen は SFT、あるいは RLHF に対応できますか? + +今のところ、ファインチューニングや RLHF のコードは提供していません。しかし、[FastChat](**[https://github.com/lm-sys/FastChat](https://github.com/lm-sys/FastChat))、[Firefly]([https://github.com/yangjianxin1/Firefly](https://github.com/yangjianxin1/Firefly))、[**LLaMA Efficient Tuning**]([https://github.com/hiyouga/LLaMA-Efficient-Tuning](https://github.com/hiyouga/LLaMA-Efficient-Tuning))など、いくつかのプロジェクトではファインチューニングをサポートしています。近日中に関連コードを更新する予定です。 +

+ + + +## トークナイザー + +#### bos_id/eos_id/pad_id が見つかりません。 + +私たちのトレーニングでは、セパレータとパディングトークンとして `<|endoftext|>` のみを使用しています。bos_id、eos_id、pad_id は tokenizer.eod_id に設定できます。私たちのトークナイザーについて詳しくは、トークナイザーについてのドキュメントをご覧ください。 + diff --git a/README_JA.md b/README_JA.md index 155fec4f..a1edc7cc 100644 --- a/README_JA.md +++ b/README_JA.md @@ -6,6 +6,7 @@

+

Qwen-7B 🤖 | 🤗  | Qwen-7B-Chat 🤖 | 🤗  | Qwen-7B-Chat-Int4 🤗 @@ -15,33 +16,33 @@

- Japanese document maintainer: Ikko Eltociear Ashimine + 日本語ドキュメントメンテナー: Ikko Eltociear Ashimine & Junyang Lin


私たちは、**Qwen-7B** と **Qwen-7B-Chat** を **🤖 ModelScope** と **🤗 Hugging Face** の両方でオープンソース化しています(上部のロゴをクリックすると、コードとチェックポイントのあるリポジトリに移動します)。このレポには、Qwen-7B の簡単な紹介と、使い方の手引き、さらに詳しい情報を提供する技術メモ [link](tech_memo.md) が含まれています。 -Qwen-7Bは、アリババクラウドが提唱する大規模言語モデルシリーズQwen(略称:Tongyi Qianwen)の7Bパラメータ版です。Qwen-7BはTransformerベースの大規模言語モデルであり、ウェブテキスト、書籍、コードなどを含む大量のデータで事前学習される。さらに、事前学習されたQwen-7Bをベースに、アライメント技術で学習された大規模モデルベースのAIアシスタントであるQwen-7B-Chatをリリースする。Qwen-7Bシリーズの特徴は以下の通りです: +Qwen-7B は、アリババクラウドが提唱する大規模言語モデルシリーズ Qwen(略称:Tongyi Qianwen)の7Bパラメータ版になります。Qwen-7B は Transformer ベースの大規模言語モデルであり、ウェブテキスト、書籍、コードなどを含む大量のデータで事前学習されています。さらに、事前学習された Qwen-7B をベースに、アライメント技術で学習された大規模モデルベースの AI アシスタントである Qwen-7B-Chat をリリースします。Qwen-7B シリーズの特徴は以下の通りです: -1. **高品質な事前トレーニングデータでトレーニング**。Qwen-7B は 2.2 兆以上のトークンを含む大規模で高品質なデータセットに対して事前学習を行った。このデータセットには平文とコードが含まれ、一般的なドメインデータと専門的なドメインデータを含む幅広いドメインをカバーしている。 +1. **高品質な事前トレーニングデータでトレーニング**。Qwen-7B は 2.2 兆以上のトークンを含む大規模で高品質なデータセットに対して事前学習を行っっています。このデータセットには平文とコードが含まれ、一般的なドメインデータと専門的なドメインデータを含む幅広いドメインをカバーしている。 2. **強いパフォーマンス**。自然言語理解、数学、コーディングなどを評価する一連のベンチマークデータセットにおいて、同程度のモデルサイズのモデルと比較して、競合他社を凌駕しています。 -3. **言語サポートの向上**。Qwen-7B のトークナイザは、15 万以上のトークンの語彙をベースにしており、他のトークナイザに比べて効率的です。多くの言語に対応しており、ユーザが特定の言語を理解するために Qwen-7B をさらに微調整するのに役立ちます。 +3. **言語サポートの向上**。Qwen-7B のトークナイザは、15 万以上のトークンの語彙をベースにしており、他のトークナイザに比べて効率的です。多くの言語に対応しており、ユーザが特定の言語を理解するために Qwen-7B をさらにファインチューニングするのに役立ちます。 4. **8K コンテキスト長をサポート**。Qwen-7B と Qwen-7B-Chat はともに 8K のコンテキスト長をサポートしており、長いコンテキストでの入力を可能にしている。 5. **プラグインのサポート**。Qwen-7B-Chat は、プラグイン関連のアライメントデータでトレーニングされているため、API、モデル、データベースなどのツールを使用することができ、エージェントとしてプレイすることができる。 -以下のセクションには、参考になる情報が記載されています。特に、issueを立ち上げる前にFAQセクションをお読みになることをお勧めします。 +以下のセクションには、参考になる情報が記載されています。特に、issue を立ち上げる前に FAQ セクションをお読みになることをお勧めします。
-## ニュース +## ニュースとアップデート -* 2023.8.21 Qwen-7B-Chat 用 Int4 量子化モデル(**Qwen-7B-Chat-Int4**)をリリースしました。メモリコストは低いが、推論速度は向上している。また、ベンチマーク評価において大きな性能劣化はありません。 -* 2023.8.3 Qwen-7B と Qwen-7B-Chat を ModelScope と Hugging Face で公開。また、トレーニングの詳細やモデルの性能など、モデルの詳細についてはテクニカルメモを提供しています。 +* 2023.8.21 Qwen-7B-Chat 用 Int4 量子化モデル **Qwen-7B-Chat-Int4** をリリースしました。また、ベンチマーク評価においても大きな性能低下は見られませんでした。 +* 2023.8.3 ModelScope と Hugging Face 上で **Qwen-7B** と **Qwen-7B-Chat** をリリースしました。また、トレーニングの詳細やモデルの性能など、モデルの詳細については技術メモを提供しています。
## パフォーマンス -一般的に、Qwen-7B は、MMLU、C-Eval、GSM8K、HumanEval、WMT22、CMMLU などの自然言語理解、数学的問題解決、コーディングなどに関するモデルの能力を評価する一連のベンチマークデータセットにおいて、同程度のモデルサイズのベースラインモデルを凌駕し、さらには 13B 程度のパラメータを持つより大規模なモデルをも凌駕している。以下の結果をご覧ください。 +一般的に、Qwen-7B は、MMLU、C-Eval、GSM8K、HumanEval、WMT22、CMMLU など、自然言語理解、数学的問題解決、コーディングなどに関するモデルの能力を評価する一連のベンチマークデータセットにおいて、同程度のモデルサイズのベースラインモデルを凌駕しており、さらには 13B 程度のパラメータを持つより大規模なモデルをも凌駕しています。以下の結果をご覧ください。 | Model | MMLU | C-Eval | GSM8K | HumanEval | WMT22 (en-zh) | CMMLU | | :---------------- | :------------: | :------------: | :------------: | :------------: | :------------: |:------------: | @@ -61,10 +62,9 @@ Qwen-7Bは、アリババクラウドが提唱する大規模言語モデルシ


-さらに、[OpenCompass](https://opencompass.org.cn/leaderboard-llm)が実施した大規模言語モデルの第三者評価によると、Qwen-7BとQwen-7B-Chatは7Bパラメータモデルのトップである。この評価は、言語理解・生成、コーディング、数学、推論などの評価のための大量の公開ベンチマークで構成されている。 +さらに、[OpenCompass](https://opencompass.org.cn/leaderboard-llm) が実施した大規模言語モデルの第三者評価によると、Qwen-7B と Qwen-7B-Chat は 7B パラメータモデルのトップになります。この評価は、言語理解・生成、コーディング、数学、推論などの評価のための大量の公開ベンチマークで構成されています。 より詳細な実験結果(より多くのベンチマークデータセットでの詳細なモデル性能)や詳細については、[こちら](tech_memo.md)をクリックして技術メモを参照してください。 -
## 必要条件 @@ -72,7 +72,6 @@ Qwen-7Bは、アリババクラウドが提唱する大規模言語モデルシ * python 3.8 以上 * pytorch 1.12 以上、2.0 以上を推奨 * CUDA 11.4 以上を推奨(GPU ユーザー、フラッシュアテンションユーザー向けなど) -
## クイックスタート @@ -205,31 +204,30 @@ print(f'Response: {response}') ## トークナイザー -tiktoken に基づくトークナイザーは、他のトークナイザー、例えばセンテンスピーストークナイザーとは異なります。特にファインチューニングの際には、特殊なトークンに注意を払う必要があります。トークナイザに関する詳細な情報や、ファインチューニングにおける使用方法については、[ドキュメント](tokenization_note.md)を参照してください。 - +tiktoken に基づくトークナイザーは、他のトークナイザー、例えばセンテンスピーストークナイザーとは異なります。特にファインチューニングの際には、特殊なトークンに注意を払う必要があります。トークナイザに関する詳細な情報や、ファインチューニングにおける使用方法については、[ドキュメント](tokenization_note_ja.md)を参照してください。
## 量子化 ### 使用方法 -**注:[AutoGPTQ](https://github.com/PanQiWei/AutoGPTQ)に基づく新しい解決策を提供し、Qwen-7B-Chat用のInt4量子化モデル[ここをクリック](https://huggingface.co/Qwen/Qwen-7B-Chat-Int4)をリリースしました。このモデルは、従来の解決策と比較して、ほぼ無損失のモデル効果を達成しつつ、メモリコストと推論速度の両方で性能が向上しています**。 +**注: [AutoGPTQ](https://github.com/PanQiWei/AutoGPTQ) に基づく新しい解決策を提供し、Qwen-7B-Chat 用の Int4 量子化モデル[ここをクリック](https://huggingface.co/Qwen/Qwen-7B-Chat-Int4)をリリースしました。このモデルは、従来の解決策と比較して、ほぼ無損失のモデル効果を達成しつつ、メモリコストと推論速度の両方で性能が向上しています。** -ここでは、量子化されたモデルを推論に使用する方法を示します。始める前に、AutoGPTQの要件を満たしていることを確認し、ソースからインストールしてください(一時的にQwenのコードは最新版のPyPIパッケージではまだリリースされていません): +ここでは、量子化されたモデルを推論に使用する方法を示します。始める前に、AutoGPTQ の要件を満たしていることを確認し、ソースからインストールしてください(一時的に Qwen のコードは最新版の PyPI パッケージではまだリリースされていません): ```bash git clone https://github.com/PanQiWei/AutoGPTQ.git && cd AutoGPTQ pip install . ``` -そうすれば、以下のように簡単に量子化モデルを読み込むことができる。 +そうすれば、以下のように簡単に量子化モデルを読み込むことができます: ```python from auto_gptq import AutoGPTQForCausalLM model = AutoGPTQForCausalLM.from_quantized("Qwen/Qwen-7B-Chat-Int4", device_map="auto", trust_remote_code=True, use_safetensors=True).eval() ``` -推論を実行するには、上で示した基本的な使い方に似ているが、generation configurationを明示的に渡すことを忘れないこと: +推論を実行するには、上で示した基本的な使い方に似ていますが、generation configuration を明示的に渡すことを忘れないで下さい: ```python from transformers import GenerationConfig @@ -239,7 +237,7 @@ response, history = model.chat(tokenizer, "Hi", history=None, generation_config= ### 性能 -ベンチマークにおけるBF16モデルとInt4モデルの性能について説明する。結果を以下に示します: +ベンチマークにおける BF16 モデルと Int4 モデルの性能について説明します。その結果は以下に示します: | Quantization | MMLU | CEval (val) | GSM8K | Humaneval | | ------------- | :--------: | :----------: | :----: | :--------: | @@ -248,16 +246,16 @@ response, history = model.chat(tokenizer, "Hi", history=None, generation_config= ### 推論スピード -BF16の精度とInt4の量子化レベルの下で、それぞれ2048個と8192個のトークンを生成する平均推論速度(tokens/s)を測定した。 +BF16 の精度と Int4 の量子化レベルの下で、それぞれ 2048 個と 8192 個のトークンを生成する平均推論速度(tokens/s)を測定しました。 | Quantization | Speed (2048 tokens) | Speed (8192 tokens) | | ------------- | :------------------:| :------------------:| | BF16 | 30.34 | 29.32 | | Int4 | 43.56 | 33.92 | -詳細には、プロファイリングの設定は、1コンテクスト・トークンで8192個の新しいトークンを生成している。プロファイリングは、PyTorch 2.0.1とCUDA 11.4を搭載したシングルA100-SXM4-80G GPUで実行される。推論速度は生成された8192個のトークンの平均値です。 +詳細には、プロファイリングの設定は、1 コンテクストトークンで 8192 個の新しいトークンを生成しています。プロファイリングは、PyTorch 2.0.1 と CUDA 11.4 を搭載したシングル A100-SXM4-80G GPU で実行されました。推論速度は生成された 8192 個のトークンの平均値となります。 -### GPUメモリ使用量 +### GPU メモリ使用量 また、BF16またはInt4の量子化レベルで、それぞれ2048トークンをコンテキストとしてエンコードした場合(および単一のトークンを生成した場合)と、8192トークンを生成した場合(単一のトークンをコンテキストとして生成した場合)のGPUメモリ使用量のピーク値をプロファイリングしました。その結果を以下に示します。 @@ -267,22 +265,21 @@ BF16の精度とInt4の量子化レベルの下で、それぞれ2048個と8192 | Int4 | 8.21GB | 13.62GB | 上記のスピードとメモリーのプロファイリングは、[このスクリプト](https://qianwen-res.oss-cn-beijing.aliyuncs.com/profile.py)を使用しています。 -
## デモ ### ウェブ UI -ウェブUIデモを構築するためのコードを提供します(@wysaidに感謝)。始める前に、以下のパッケージがインストールされていることを確認してください: +ウェブ UI デモを構築するためのコードを提供します(@wysaid に感謝)。これを始める前に、以下のパッケージがインストールされていることを確認してください: -``` +```bash pip install -r requirements_web_demo.txt ``` -そして、以下のコマンドを実行し、生成されたリンクをクリックする: +そして、以下のコマンドを実行し、生成されたリンクをクリックします: -``` +```bash python web_demo.py ``` @@ -294,7 +291,7 @@ python web_demo.py ### CLI デモ -`cli_demo.py` に CLI のデモ例を用意しています。ユーザはプロンプトを入力することで Qwen-7B-Chat と対話することができ、モデルはストリーミングモードでモデルの出力を返します。以下のコマンドを実行する: +`cli_demo.py` に CLI のデモ例を用意しています。ユーザはプロンプトを入力することで Qwen-7B-Chat と対話することができ、モデルはストリーミングモードでモデルの出力を返します。以下のコマンドを実行する: ``` python cli_demo.py @@ -308,45 +305,47 @@ python cli_demo.py ## API -OpenAI APIをベースにローカルAPIをデプロイする方法を提供する(@hanpenggitに感謝)。始める前に、必要なパッケージをインストールしてください: +OpenAI API をベースにローカルAPIをデプロイする方法を提供する(@hanpenggit に感謝)。始める前に、必要なパッケージをインストールしてください: ```bash pip install fastapi uvicorn openai pydantic sse_starlette ``` -それから、APIをデプロイするコマンドを実行する: +それから、API をデプロイするコマンドを実行します: ```bash python openai_api.py ``` -チェックポイント名やパスには `-c` 、CPU デプロイメントには `--cpu-only` など、引数を変更できます。APIデプロイメントを起動する際に問題が発生した場合は、パッケージを最新バージョンに更新することで解決できる可能性があります。 +チェックポイント名やパスには `-c`、CPU デプロイメントには `--cpu-only` など、引数を変更できます。API デプロイメントを起動する際に問題が発生した場合は、パッケージを最新バージョンに更新することで解決できる可能性があります。 -APIの使い方も簡単だ。以下の例をご覧ください: +API の使い方も簡単です。以下の例をご覧ください: ```python import openai openai.api_base = "http://localhost:8000/v1" openai.api_key = "none" -# create a request activating streaming response +# ストリーミングレスポンスを有効化するリクエストを作成する for chunk in openai.ChatCompletion.create( model="Qwen", messages=[ {"role": "user", "content": "你好"} ], stream=True + # ストリーミング出力形式でのストップワードの指定はまだサポートされておらず、開発中です。 ): if hasattr(chunk.choices[0].delta, "content"): print(chunk.choices[0].delta.content, end="", flush=True) -# create a request not activating streaming response +# ストリーミングレスポンスを有効化しないリクエストを作成する response = openai.ChatCompletion.create( model="Qwen", messages=[ {"role": "user", "content": "你好"} ], - stream=False + stream=False, + stop=[] # 例えば、stop=["Observation:"] (ReAct プロンプトの場合)。 ) print(response.choices[0].message.content) ``` @@ -357,29 +356,27 @@ print(response.choices[0].message.content)

-## Deployment +## デプロイ -CPU上でモデルを実行するのは簡単で、以下のようにデバイスを指定する必要がある: +CPU 上でモデルを実行するのは簡単であり、以下のようにデバイスを指定する必要があります: ```python model = AutoModelForCausalLM.from_pretrained("Qwen/Qwen-7B-Chat", device_map="cpu", trust_remote_code=True).eval() ``` -``` -メモリ不足に悩まされ、複数のGPUにモデルをデプロイしたい場合は、``utils.py`で提供されているスクリプトを使うことができます: +メモリ不足に悩まされ、複数の GPU にモデルをデプロイしたい場合は、`utils.py` で提供されているスクリプトを使うことができます: ```python from utils import load_model_on_gpus model = load_model_on_gpus('Qwen/Qwen-7B-Chat', num_gpus=2) ``` -7Bチャットモデルの推論を2GPUで実行できます。 +7B チャットモデルの推論を 2GPU で実行できます。
## ツールの使用 Qwen-7B-Chat は、API、データベース、モデルなど、ツールの利用に特化して最適化されており、ユーザは独自の Qwen-7B ベースの LangChain、エージェント、コードインタプリタを構築することができます。ツール利用能力を評価するための評価[ベンチマーク](eval/EVALUATION.md)では、Qwen-7B は安定した性能に達しています。 -[](https://) | Model | Tool Selection (Acc.↑) | Tool Input (Rouge-L↑) | False Positive Error↓ | |:-----------------|:----------------------:|:----------------------:|:----------------------:| @@ -389,7 +386,7 @@ Qwen-7B-Chat は、API、データベース、モデルなど、ツールの利 ReAct プロンプトの書き方や使い方については、[ReAct の例](examples/react_prompt.md)を参照してください。ツールを使用することで、モデルがよりよいタスクを実行できるようになります。 -さらに、エージェントとしての能力を示す実験結果を提供する。詳細は [Hugging Face Agent](https://huggingface.co/docs/transformers/transformers_agents) を参照。Hugging Face が提供するランモードベンチマークでの性能は以下の通りです: +さらに、エージェントとしての能力を示す実験結果を提供する。詳細は [Hugging Face Agent](https://huggingface.co/docs/transformers/transformers_agents) を参照して下さい。Hugging Face が提供するランモードベンチマークでの性能は以下の通りです: | Model | Tool Selection↑ | Tool Used↑ | Code↑ | |:-----------------|:---------------:|:-----------:|:---------:| @@ -425,17 +422,17 @@ ReAct プロンプトの書き方や使い方については、[ReAct の例](ex -
+

## 再現 -ベンチマークデータセットでのモデル性能の再現のために、結果を再現するスクリプトを提供しています。詳しくは [eval/EVALUATION.md](eval/EVALUATION.md) を確認してください。なお、再現の結果、我々の報告結果と若干異なる場合がある。 +ベンチマークデータセットでのモデル性能の再現のために、結果を再現するスクリプトを提供しています。詳しくは [eval/EVALUATION.md](eval/EVALUATION.md) を確認してください。なお、再現の結果、我々の報告結果と若干異なる場合があります。
## FAQ -問題が発生した場合は、[FAQ](FAQ.md)やissueを参照し、新しいissueを立ち上げる前に解決策を探してください。 +問題が発生した場合は、まずは [FAQ](FAQ_ja.md) や issue を参照し、新しい issue を立ち上げる前に解決策を探してください。
diff --git a/tokenization_note_ja.md b/tokenization_note_ja.md new file mode 100644 index 00000000..db0d1443 --- /dev/null +++ b/tokenization_note_ja.md @@ -0,0 +1,127 @@ +# トークン化 + +Qwen-7B は `tiktoken` パッケージを使用して、UTF-8 バイトを BPE トークン化します。 +Qwen-7B には 2 種類のトークンがあります。BPE の通常のトークン (`bytes` 型) と特殊/制御トークン (`str` 型) です。 + +```python +from transformers import AutoTokenizer + +tokenizer = AutoTokenizer.from_pretrained('Qwen/Qwen-7B', trust_remote_code=True) +``` + +## 通常のトークン + +通常のトークンは、UTF-8 エンコーディングでエンコードされたテキストのバイト列から学習した BPE トークンです。 +これによってすべてのテキストをトークン化することができ、未知のトークンは存在しませんが、一般的でないテキストをトークン化するときにシングルバイトを使用するようにフォールバックすることがあります。 +UTF-8 のデコードエラーに遭遇することがあり、そのエラーのデフォルトは `replace` であるため、不完全な生成では置換文字 (�) が使用されます。 +この動作は `errors="ignore"` を `decode` 関数に渡すことで変更することができる。 +`errors` のオプションについては、[Python ドキュメント](https://docs.python.org/3/library/stdtypes.html#bytes.decode) を参照してください。 + +```python +>>> tokenizer.decode([51461]) +' �' + +>>> tokenizer.convert_ids_to_tokens([51461]) +[b' \xe6\xa0'] + +>>> b' \xe6\xa0'.decode("utf-8", errors='replace') +' �' + +>>> tokenizer.decode([51461, 117]) +' 根' + +>>> tokenizer.convert_ids_to_tokens([51461, 117]) +[b' \xe6\xa0', b'\xb9'] + +>>> b' \xe6\xa0\xb9'.decode("utf-8", errors='replace') +' 根' +``` + +通常のトークン (`bytes` 単位) からその ID へのマッピングは `tokenizer.get_vocab()` から取得できます。 +通常のトークンを語彙に追加することはサポートしていませんし、推奨もしていません。 + +## 特別なトークン + +特別なトークンは、例えば文書の最後に到達するなど、モデルにとって特別な機能を意味します。 +理論的には、これらは入力テキストには存在せず、入力テキストが処理された後にのみ現れます。 +例えば、文書の終わりを表す `<|endoftext|>` のような表面的な形は、参照を容易にするためだけのものである。 +現在、Qwen-7B では `<|endoftext|>` が、Qwen-7B-Chat では `<|endoftext|>`, `<|im_start|>`, `<|im_end|>` が特殊トークンとして使われています。 +他の目的のために、`<|extra_0|>` から `<|extra_204|>` までの特別なトークンを保持しています。 +特殊トークンの表面形式 (`str` 内) から ID へのマッピングは `tokenizer.special_tokens` から取得できます。 + +`bos`、`eos`、`unk`、`pad`、`mask`、`sep` などの概念は学習済みモデル(Qwen-7B と Qwen-7B-Chat)には適用できません。 +しかし、`pad` トークンは話が別です。理論的には、モデルがこのトークンを見たり計算したりすることはないので、既知のトークンを使用することができます。 +しかし、安全のために、トークナイザーの初期化で指定する特別なトークンの値は、既知の特別なトークンに限定します。 +微調整やその他のフレームワークで特別なトークンを必要とする場合は、次のように指定できます + +```python +from transformers import AutoTokenizer + +tokenizer = AutoTokenizer.from_pretrained('Qwen/Qwen-7B', trust_remote_code=True, pad_token='<|endoftext|>') +``` + +> 警告: 私たちが事前に学習したモデルでは、`bos`, `eos`, `unk` などを設定しても意味がありません。 +> 特に、`<` を `eos` のように使ってはいけません。 +> 特に `<|endoftext|>` を `eos` として使用することは、文末と文末が同じであると確信できる場合を除き、避けるべきです。 + +## インジェクション攻撃の防止 + +特殊トークンは通常のトークンとは異なるため、コントロールトークンの表面形が入力テキストに現れるとどうなるでしょうか? +例えば、次のようなテキストがあるとします + +``` +print("<|endoftext|>") +``` + +これは次のようにしてトークン化する必要があります + +``` +ids:[1350, 9639, 91, 8691, 723, 427, 91, 82598] +tokens: [b'print', b'("<', b'|', b'endo', b'ft', b'ext', b'|', b'>")'] +``` + +こちらではありません + +``` +ids: [1350, 445, 151643, 899] +tokens: [b'print', b'("', '<|endoftext|>', b'")'] +``` + +つまり、特殊トークンの表面形は通常のテキストと同じように扱い、特殊トークンはテキストのトークン化後に開発者が処理するというものです。 +しかし、これはコミュニティにおける(安全ではないとはいえ)慣習に抵触し、開発者が車輪を再利用するための新たなステップを追加することになります。 + +デフォルトの動作は、すべての既知の特殊トークンの表面形を特殊トークンとして解析するように変更されました。 +インジェクション防止を有効にするには、トークナイザーの呼び出しに `allowed_special=set()` を渡します: + +```python +>>> tokenizer('print("<|endoftext|>")', allowed_special=set()) +{'input_ids': [1350, 9639, 91, 8691, 723, 427, 91, 82598], 'token_type_ids': [0, 0, 0, 0, 0, 0, 0, 0], 'attention_mask': [1, 1, 1, 1, 1, 1, 1, 1]} +``` + +`str` のセットを `allowed_special` として渡すことで、きめ細かく動作を制御することができます + +```python +>>> tokenizer('print("<|extra_0|>")<|endoftext|>', allowed_special={'<|endoftext|>'}) +{'input_ids': [1350, 9639, 91, 15460, 62, 15, 91, 82598, 151643], 'token_type_ids': [0, 0, 0, 0, 0, 0, 0, 0, 0], 'attention_mask': [1, 1, 1, 1, 1, 1, 1, 1, 1]} +``` + +`str` のコレクションを `disallowed_special` として渡すことで、特定の特殊なトークンの表形式が入力テキストで遭遇した場合にトークナイザーがエラーを発生するようにすることもできます + +```python +>>> tokenizer('print("<|extra_0|>")<|endoftext|>', allowed_special={'<|endoftext|>'}, disallowed_special=('<|extra_0|>', )) +... +ValueError: Encountered text corresponding to disallowed special token '<|extra_0|>'. +If you want this text to be encoded as a special token, pass it to `allowed_special`, e.g. `allowed_special={'<|extra_0|>', ...}`. +If you want this text to be encoded as normal text, disable the check for this token by passing `disallowed_special=(enc.special_tokens_set - {'<|extra_0|>'})`. +To disable this check for all special tokens, pass `disallowed_special=()`. +``` + +`allowed_special` と `disallowed_special` の詳細については、[`tiktoken` ドキュメント](https://github.com/openai/tiktoken/blob/095924e02c85617df6889698d94515f91666c7ea/tiktoken/core.py#L75)を参照してください。 + +新しいデフォルトは以下の通り + +```python +>>> tokenizer('print("<|endoftext|>")', allowed_special="all", disallowed_special=()) +{'input_ids': [1350, 445, 151643, 899], 'token_type_ids': [0, 0, 0, 0], 'attention_mask': [1, 1, 1, 1]} +``` +