# FLAN-UL2

## 概要

[Flan-UL2](https://www.yitay.net/blog/flan-ul2-20b) は、T5 アーキテクチャをベースにしたエンコーダー・デコーダーモデルです。昨年リリースされた [UL2](ul2) モデルと同じ設定を使用しています。「Flan」プロンプトチューニングとデータセットコレクションを用いてファインチューニングされています。`Flan-T5` と同様に、モデルのファインチューニングを行わずに FLAN-UL2 の重みを直接使用できます:

元のブログによると、主な改善点は以下の通りです。

- 元のUL2モデルは、受容野が512に制限されていたため、Nが大きいNショットプロンプティングには最適ではありませんでした。
- Flan-UL2 チェックポイントは、受容野が 2048 であるため、フェューショットのインコンテキスト学習により利用しやすくなっています。
- 元のUL2モデルには、良好なパフォーマンスを得るためにほぼ必須であったモード切り替えトークンがありました。ただし、推論やファインチューニング中にしばしば変更が必要になるため、やや煩雑でした。今回の更新/変更では、Flanの指示チューニングを適用する前に「モードトークン」を忘れるよう、UL2 20Bを小規模なバッチサイズでさらに10万ステップにわたり継続学習させました。このFlan-UL2チェックポイントでは、もはやモードトークンは不要です。
Googleは、以下のバリアントをリリースしました:

元のチェックポイントは[こちら](https://github.com/google-research/google-research/tree/master/ul2)で確認できます。

## リソースが限られたデバイスでの実行

モデルは非常に重く（半精度で約40GB）なります。そのため、モデルを単に実行したい場合は、8bitでモデルを読み込み、`device_map="auto"` を使用して、OOM（メモリ不足）の問題が発生しないようにしてください。

```python
from transformers import AutoModelForSeq2SeqLM, AutoTokenizer, BitsAndBytesConfig

model = AutoModelForSeq2SeqLM.from_pretrained("google/flan-ul2", quantization_config=BitsAndBytesConfig(load_in_8bit=True), device_map="auto")
tokenizer = AutoTokenizer.from_pretrained("google/flan-ul2")

inputs = tokenizer("A step by step recipe to make bolognese pasta:", return_tensors="pt").to(model.device)
outputs = model.generate(**inputs)
print(tokenizer.batch_decode(outputs, skip_special_tokens=True))
['In a large skillet, brown the ground beef and onion over medium heat. Add the garlic']
```

API リファレンス、ヒント、コード例、ノートブックについては、[T5 のドキュメントページ](t5)を参照してください。

