$30 off During Our Annual Pro Sale. View Details »

Transformer系機械学習モデルを取り巻くライブラリや用語を整理する

bobfromjapan
November 11, 2023

 Transformer系機械学習モデルを取り巻くライブラリや用語を整理する

mishima.syk #20

bobfromjapan

November 11, 2023
Tweet

More Decks by bobfromjapan

Other Decks in Science

Transcript

  1. Transformer系機械学習モデルを取り巻くラ
    イブラリや用語を整理する
    @bobfromjapan
    mishima.syk#20

    View Slide

  2. ● 名前: bobfromjapan
    ● 出身: 東京都
    ○ 某大学の生化学専攻で修士卒です
    ● 所属: 某製薬企業
    ○ 研究所のIT技術活用の企画・推進をしています
    ● 担当領域: クラウド・機械学習
    ● 趣味: 機械学習・自作PC・読書・ゲーム
    ○ Kaggleで活動中です
    自己紹介
    https://www.kaggle.com/bobfromjapan

    View Slide

  3. この発表の目的
    ● 1GPUしかないけど独自のデータセットで特定のタスクに特化した
    Llama2-7Bをトレーニン
    グしたい!
    ● ChatGPTのAPIで社内文書をもとにした質問応答を行えるデモ用Webアプリを作りたい!
    ● ローカルで70Bモデルを試しに動かしてみたい!

    View Slide

  4. この発表の目的
    ● 1GPUしかないけど独自のデータセットで特定のタスクに特化した
    Llama2-7Bをトレーニン
    グしたい!
    ● ChatGPTのAPIで社内文書をもとにした質問応答を行えるデモ用Webアプリを作りたい!
    ● ローカルで70Bモデルを試しに動かしてみたい!
    ✔ 最近流行りの大規模言語モデルを利用して、こんな感じのタスクをこなすには何を
    使えば良いのか?
    ✔ HuggingFace, LangChain, RAG, CoT, llama.cpp, Gradioなどなど、最近よく聞く
    単語たちは何を示しているのか?
    ❌ 詳しい使い方の説明、原理の説明は行いません!

    View Slide

  5. 扱うトピック一覧
    量子化・学習/推論効率化
    ● DeepSpeed
    ● ZeRO
    ● LoRA
    ● bitsandbytes
    ● GGML
    ● llama.cpp
    Nvidia以外のGPU使う系
    ● ROCm
    ● DirectML
    HuggingFace関連
    ● transformers
    ● accelerate
    ● datasets
    ● peft
    LLM活用ライブラリ
    ● LangChain
    ● Semantic kernel
    ● Guidance
    プロンプトエンジニアリング関連
    ● RAG
    ● CoT
    LLMの名前とか
    ● Anthropic
    ● Amazon Titan
    ● Bard などなど
    Pythonの簡易ウェブアプリ作成
    ● Gradio
    ● Streamlit

    View Slide

  6. HuggingFace系ライブラリ
    ● HuggingFace社: オープンソースで機械学習モデルを構築、デプロイ、およびトレー
    ニングするためのツールとリソースを開発
    ○ transformers
    ○ accelerate
    ○ datasets
    ○ peft など
    ■ 一般名詞と被っているライブラリ名が多く若干検索性が悪い ……。
    ● また、多くの人がお世話になっているであろう機械学習モデルのリポジトリである
    HuggingFace Hubを運営しているのもここ
    参考リンク
    ● https://github.com/huggingface
    ● https://huggingface.co/

    View Slide

  7. HuggingFace/transformers
    主な特徴
    ● テキスト、視覚、音声などのさまざまなモダリティに対してタスクを実行するための、
    事前に訓練された何千ものモデルの実装を提供するパッケージ
    ○ 多くのモデルはPyTorchで実装されているが、 TensorFlow、JAX実装があるものもある
    ● transformersで読み込んだモデルは、通常のPyTorchと同じAPIで学習・推論させ
    ることもできるし、専用のAPI(trainer API)から利用することもできる
    用途
    ● 最新の機械学習モデルを使った学習・推論を自前で行いたい
    参考リンク
    ● https://github.com/huggingface/transformers

    View Slide

  8. HuggingFace/accelerate
    主な特徴
    ● PyTorchコードを分散環境で簡単に実行できるようにするライブラリで、数行の追加
    だけでPyTorchコードを任意の分散設定で実行できるようにできる
    用途
    ● HuggingFace transformerで読み込んだモデル以外を分散環境で使いたいときに
    使う
    参考リンク
    ● https://github.com/huggingface/accelerate

    View Slide

  9. HuggingFace/datasets
    主な特徴
    ● 数万の画像、言語、音声のHuggingFace Hubに公開されたデータセットに、TF,
    PyTorchどちらからでも共通のAPIでアクセス可能になる
    ● Apache Arrowによるシリアル化により大規模なデータセットも効率的に読込みでき

    用途
    ● オープンなデータセットを使ったトレーニングや検証
    参考リンク
    ● https://github.com/huggingface/datasets

    View Slide

  10. HuggingFace/peft
    主な特徴
    ● PEFTはParameter-Efficient Fine-Tuningの略で、事前学習済み言語モデルを各
    種の下流タスクに効率的に、全パラメータの微調整なし適応させる手法を提供する
    ● 後述のLoRAを含め、Prefix Tuning、P-Tuning、Prompt Tuning、AdaLoRA、
    LLaMA-Adapter、IA3といった複数のPEFT手法を実装している
    用途
    ● LLMの特定タスクへのファインチューニング
    参考リンク
    ● https://github.com/huggingface/peft

    View Slide

  11. HuggingFace系まとめて利用例
    from peft import prepare_model_for_kbit_training
    from peft.utils.config import TaskType
    model = prepare_model_for_kbit_training(model)
    peft_config = LoraConfig(
    lora_alpha=16,
    lora_dropout=0.1,
    r=32,
    bias="none",
    task_type=TaskType.SEQ_CLS,
    inference_mode=False,
    # target_modules=["self_attn"]
    target_modules=['q_proj', 'out_proj', 'k_proj',
    'v_proj'],
    )
    lora_model = get_peft_model(model,
    peft_config)
    lora_model.print_trainable_parameters()
    from transformers import AutoTokenizer
    from transformers import
    AutoModelForMultipleChoice, TrainingArguments,
    Trainer
    model_name= "mistralai/Mistral-7B-v0.1"
    tokenizer =
    AutoTokenizer.from_pretrained(model_name,
    truncation_side='left')
    bnb_config = transformers.BitsAndBytesConfig(
    load_in_4bit=True,
    bnb_4bit_use_double_quant=True,
    bnb_4bit_quant_type="nf4",
    bnb_4bit_compute_dtype=torch.bfloat16
    )
    model =
    AutoModelForSequenceClassification.from_pretrain
    ed(model_name, num_labels=5,
    quantization_config=bnb_config)
    training_args = TrainingArguments(
    do_train = True,
    do_eval=True,
    warmup_ratio=0.8,
    learning_rate=5e-6,
    per_device_train_batch_size=2,
    per_device_eval_batch_size=4,
    num_train_epochs=3,
    report_to='none',
    output_dir='.',
    )
    trainer = Trainer(
    model=model,
    args=training_args,
    train_dataset=tokenized_train_dataset,
    eval_dataset=tokenized_val_dataset,
    tokenizer=tokenizer,
    compute_metrics=compute_metrics,
    )

    View Slide

  12. DeepSpeed
    主な特徴
    ● マイクロソフトが開発している機械学習の実行最適化ライブラリ
    ● 分散学習/推論を行ったり、RAM使用量の節約を行ったりできる
    ○ ここで使われている手法の名前が後述の ZeRO
    用途
    ● 少ないVRAMのGPUでLLMのトレーニングをしたい
    ○ 24GBでも7Bくらいまでなら行ける
    ● 複数マシンで大量のGPUを使ってLLMをトレーニングしたい
    参考リンク
    ● https://github.com/microsoft/DeepSpeed
    ● https://github.com/microsoft/DeepSpeed/tree/master/examples

    View Slide

  13. ZeRO
    主な特徴
    ● マイクロソフトが開発している機械学習の実行最適化手法
    ● いくつかの最適化ステージが提案されている。
    ● ZeRO Stage 1:
    ○ オプティマイザの状態(たとえば、Adamオプティマイザの32ビットの重み、モーメント)がプロセス間で分割され、各プロセスは自分の分割だけを
    更新します 。
    ● ZeRO Stage 2:
    ○ モデルの重みを更新するための縮小された32ビットの勾配も分割され、各プロセスはオプティマイザの状態の一部に対応する勾配のみを保持し
    ます 。
    ● ZeRO Stage 3 (ZeRO-3):
    ○ 16ビットのモデルパラメータがプロセス間で分割され、ZeRO-3は前方および後方のパス中にそれらを自動的に収集および分割します。また、
    ZeRO-3は、CPUとNVMeメモリの両方にオフロードできるインフィニティオフロードエンジンを含み、これにより巨大なメモリ節約が可能になりま
    す 。
    用途
    ● DeepSpeed上で実装されており、大規模言語モデルの分散学習・推論を行うために利用される
    参考リンク
    ● https://dl.acm.org/doi/10.5555/3433701.3433727

    View Slide

  14. LoRA
    ● Transformer系モデルのファインチューニング手法の一つ
    ● 学習済みのパラメータはフリーズし、それぞれのAttentionブロックの前後に学習可
    能なFC層を挿入することで特定のタスクに対応
    ● 学習するパラメータ数を大きく削減できる
    ○ 学習させたLoRA層のみをメインのLLMにアダプタのように取り変えるだけで様々なタスクに対応さ
    せることができるという運用上のメリットも有る
    ○ LLM自体は数10GBあっても、たった数百 MBのファイルのダウンロードだけで特定のタスクに対応

    View Slide

  15. モデルの量子化
    ● 機械学習モデルでは各パラメータが32ビットの浮動小数点数で表現
    ● しかし、実用上これほど高い精度が必要なく、多くの場面でより低い精度でも十分
    な性能を維持できることが知られている
    ● 計算コストとメモリ使用量を削減するため、精度を下げて学習・推論させることが多
    くなってきた
    ● 半精度(FP16)やより機械学習に適したレンジを持つBF16、更に最近では数ビット
    の精度まで削減したモデルも利用されている
    →これに関連するのがbitsandbytes, GGML, llama.cpp

    View Slide

  16. GGML
    主な特徴
    ● Georgi Gerganov氏が開発
    ● C言語で書かれた機械学習推論用ライブラリ
    ● 16ビット浮動小数点数、整数量子化(4ビット、5ビット、8ビットなど)の機械学習モデ
    ルの推論を実行可能
    用途
    ● 多くの場合後述のllama.cppのバックエンドで利用される
    参考リンク
    ● https://github.com/ggerganov/ggml

    View Slide

  17. llama.cpp
    主な特徴
    ● Georgi Gerganov氏が開発
    ● C言語で記述されたLLMの実行ソフトウェア
    ● 量子化されたLLMモデルをCPUのみ、CPU+GPUなどの様々な実行環境で動か
    すことができる
    ○ モデルの一部のレイヤーのみを GPU、残りをCPUで実行することもでき、 VRAMに乗り切らないモ
    デルを動かすこともできる
    用途
    ● ローカルPCで大きなモデルを実行するために利用→デモ
    参考リンク
    ● https://github.com/ggerganov/llama.cpp

    View Slide

  18. bitsandbytes
    主な特徴
    ● Tim Dettmers氏が開発
    ● PyTorch用のCUDAカスタム関数の軽量ラッパーで、特に8ビットの最適化関数、行
    列の乗算、および量子化関数をサポート
    ○ torch.nn.Linearのサブクラスとして実装されており、基本的にこれを含む任意のモデルの量子化を
    行うことが可能
    用途
    ● HuggingFace Transformersから利用するのが一番簡単
    ○ 対応するモデルであれば、 HuggingFaceモデルの読み込み時に `load_in_8bit=True`とするだけで
    BitsandBytesによる量子化が適応される
    参考リンク
    ● https://github.com/TimDettmers/bitsandbytes

    View Slide

  19. LLMを使った開発用ツール群
    ● 一番有名なのはLangChainだが、他にもSemantic KernelやGuidanceなど
    項目
 補足
 guidance
 semantic kernel
 langchain

    githubスター数
 人気度(2023年6月3日時点)
    
 9.1k
 9.7k
 44.5k

    抽象度
 ユーザ側でどれだけプロンプトを書くか
    
 低い(=自分でプロンプトを書く)
    
 中間
 高い

    機能の多さ
 提供される機能の幅
    
 少なめ(?)
 普通
 多め

    自由度の高さ
 自分好みのプロンプトにできるかどうか
    
 高い
 高め
 低め(?)

    エージェント機能
 複数の処理を自動実行するやつ
    
 ユーザ側で作り込みが必要
    
 ライブラリで提供
 ライブラリで提供(多種
    類)

    エージェント制御
 エージェントの制御のしやすさ
    
 制御しやすい
 制御しやすい
 制御しにくい

    プロンプトの管理
 複数のプロンプトを管理しやすいか
    
 ユーザ側で工夫
 機能として提供
 ユーザ側で工夫

    ハードル
 理解/習得の難易度
    
 普通
 高め(ドキュメント/実装例 少)
    
 高め (機能多すぎ...)

    https://qiita.com/sakue_103/items/6ffee0bc267e71eafd60 より引用

    View Slide

  20. LangChainでできること
    ● プロンプトテンプレート: 様々な種類のプロンプトのテンプレートを提供
    ● LLM: GPT、Llama、Bedrockなどの大規模な言語モデルを利用
    ● エージェント: LLMを使用してどのようなアクションを実行するかを決定し、Web検索
    や計算機などのツールを利用させる
    ● メモリ: 会話の履歴を保存する記憶機能を提供
    ● インデックス: 外部データの利用をサポート
    ● ドキュメントローダー: テキスト、CSV、PDFなどの様々なフォーマットのデータを
    ロード
    ● チェーン: 複数の処理を一連の処理として実行
    ● https://github.com/langchain-ai/langchain

    View Slide

  21. プロンプトエンジニアリング関連
    ● 様々な手法が日々生まれているジャンルだが、特に広く使われている2手法に関し
    て紹介
    ○ CoT, RAG
    ● その他の多くの方法の紹介については、例えば次のURL等を参考
    ○ https://www.promptingguide.ai/jp
    ○ https://qiita.com/fuyu_quant/items/157086987bd1b4e52e80

    View Slide

  22. Chain of Thought(CoT)
    主な特徴
    ● 言語モデルに「思考過程」を生成させる手法 。
    ● 問題を解決するための中間的な推論ステップを連続して生成する能力を言語モデルに付与する 。
    具体的な説明
    利点
    ● モデルが段階的な推論を必要とする問題に対して、途中の推論を追加で学習することができる 。
    ● 推論ステップを分割することで、どの推論で間違えたのかが分かるようになる 。
    ● 数学の文章問題、常識問題などの人間が言語を介して解くことができるあらゆるタスクに適用可能 。
    https://www.promptingguide.ai/jp/techniques/cot

    View Slide

  23. Retrieval Augmented Generation(RAG)
    ● 外部の知識源を利用してLLM出力の質を向上させる手法
    ○ ハルシネーションの低減策としても有効
    ● リトリーバの実装方法も色々
    ○ LLMのデコーダで埋め込みベクトルを取るほか、従来の NLP手法であるTFIDFやWord2Vecなどを
    使っても良い。サービスであれば ElasticSearchやAmazon Kendra等もあり。
    ○ ベクトル間の類似度評価には FAISSというライブラリを使うことが多い印象。
    https://cs.stanford.edu/~myasu/blog
    /racm3/

    View Slide

  24. Nvidia以外のGPU使う系
    ● 最近よく取り沙汰されるNVIDIAのGPU不足
    ● AMDやIntel等の他のGPUを機械学習に利用しやすくする手法として目にする頻度
    が増えてきているので名前だけ紹介
    ● ROCm: AMD GPUを汎用計算に用いるためのドライバ、SDK、APIを提供。簡単
    に言えばAMD版CUDAだが、オープンソースで開発されている
    ● DirectML: WindowsにおけるGPUを使った機械学習の実行
    ○ グラフィック用のAPI(DirectX)を行列計算に利用しているため、基本的に DirectX 12が動くGPUで
    あれば全てで使える
    ○ 最近ではWindowsのTensorFlowでCUDAのNativeビルドが配布されなくなったので、
    DirectMLを利用することがある

    View Slide

  25. Pythonの簡易ウェブアプリ作成
    ● GradioとStreamlitが最近よく使われている印象
    ○ 特にGradioに関しては最近Stable DiffusionやLLMのウェブUI作成に使われており人気
    ■ AUTOMATIC1111/stable-diffusion-webui
    ■ oobabooga/text-generation-webui
    ○ Gradioは機械学習のデモに特化しており、 Streamlitのほうがより汎用的
    特徴 Gradio Streamlit
    用途
    Gradioは機械学習モデルのために特化しており、簡単に学ぶこ
    とができます 。
    Streamlitはより汎用的で、機械学習モデル専用でないWebアプリケー
    ションを作成する場合に適しています 。
    カスタマイズ
    Gradioは情報が限られていますが、簡単な視覚化を提供しま
    す。
    Streamlitは、アプリの外観と感じを微調整することができるより多くの
    カスタマイズオプションを提供します 。
    サポートとドキュ
    メント
    Gradioは簡単な視覚化に適していますが、Streamlitに比べてサ
    ポートベースとドキュメントが少ないかもしれません 。
    Streamlitは、より大きなサポートベースと詳細なドキュメントおよび例
    を提供します 。

    View Slide

  26. モデル名 開発元 提供プラットフォーム パラメータ数 最大コンテク
    スト長
    言語 ライセンス
    GPT-4-Turbo OpenAI Azure, OpenAI ? 128K multilingual プロプライエタリ
    Llama2 Meta AWS, Azure, GCP,
    HuggingFaceなど
    7B, 13B, 70B 4K 英 独自OSライセンス
    Titan AWS Amazon Bedrock 45B? 4K 英 プロプライエタリ
    PaLM2 Google GCP 8B? 62B? 8K multilingual プロプライエタリ
    Claude 2 Anthropic Amazon Bedrock,
    Anthropic
    ? 100K 日含む95カ国語 プロプライエタリ
    Jurassic-2
    Ultra
    AI21 Amazon Bedrock,
    AI21 Studio
    ? 8K 英仏独伊蘭葡
    西
    プロプライエタリ
    Mistral-7B-v0.1 Mistral AI HuggingFace 7B 32K 英 Apache 2.0
    Yi 01.AI Hugging Face 6B, 34B 200K 英中 独自OSライセンス
    CALM2 CyberAgent HuggingFace 7B 32K 英日 Apache 2.0
    2023/11/11現在よさげなLLM

    View Slide

  27. まとめ
    ● 1GPUしかないけど独自のデータセットで特定のタスクに特化した
    Llama2-7Bをトレーニン
    グしたい!
    → DeepSpeedのCPUオフロードとHuggingFaceでBitsandBytes量子化を指定しVRAM使用
    量を削減して読み込んで学習させる
    ● ChatGPTのAPIで社内文書をもとにした質問応答を行えるデモ用Webアプリを作りたい!
    →GradioでUIを作ってLangChainでRAG!
    ● ローカルで70Bモデルを試しに動かしてみたい!
    → 量子化されたモデルをHuggingFace Hubからダウンロードしてきてllama.cppでCPU,GPU
    混合で動かす!

    View Slide

  28. 量子化モデルの違い
    https://github.com/ggerganov/llama.cpp/discussions/2094

    View Slide