Open GENZITSU opened 3 months ago
TDAI LabがまとめたNeruIPSから見た近年のAIトレンドまとめスライド
とても良いまとめで参考になることが多いが、特に気になったところのみ抜粋
LLMのアライメント手法の簡素化が進んでいる
LLMになってもデータは重要
予算制約がある中で、どのデータを選択して学習に用いるかという話題
生成AIで作成したデータを用いた学習
少ないデータでも何epochかは回した方が良い (通常は1epochだったらしい...
マルチモーダルLLMの基本着想
マルチモーダルでもCoTは有効に働きうる
トレンド把握するのにちょうど良いまとめだった。 生成AIで作成したデータによる学習の論文は詳しく見てみたい
uzabaseの2024年版Pythonベストプラクティス集的なやつ
ためになったところだけメモ (自分の理解に収まるもののみ)
複数のプログラミング言語のバージョンをまとめて管理できるツールが存在する
また、Pythonを含む複数のプログラミング言語のバージョンをまとめて管理できるツールもあります。anyenvやasdfが有名ですが、個人的なおすすめはmiseです(発音は "meez")。以前は「rtx」という名前でしたが、NVIDIAのGPUシリーズ「RTX」との混乱を避けるため「mise」に変更されました。
Python 3.10以降は Union[str, int] や Optional[int] をそれぞれ str | int や int | None と短く書けるようになりました。from typing import Union, Optional などのimport文の記述も不要になります。 また、3.10以降は型の別名を定義するときに TypeAlias を使って明示的に定義できるようになりました。
from typing import TypeAlias
ItemPrices: TypeAlias = list[tuple[str, int]]
dataclassにおけるfrozen=True
およびdataclasses.replace
による別インスタンス生成
ちなみにfrozen=TrueはPydanticのdataclassでも利用可能
import dataclasses
from dataclasses import dataclass
@dataclass(frozen=True)
class User:
name: str
deactivated: bool = False
user1 = User("taro") # User(name="taro")でもOK
user2 = User("hanako", True)
user3 = dataclasses.replace(user2, deactivated=False)
煩わしいやつが解消されている
さらに、Python 3.12 からはf"name={user["name"]}"のようにf文字列全体の引用符と同じ引用符を式の中でも使用できるようになりました。以前はf"name={user['name']}"のように異なる引用符を使う必要がありましたが、そのような配慮は不要になりました。
click, Typerを用いたより可読性の高いCLIアプリケーション構築
import click
@click.command()
@click.argument("name")
@click.option("--greeting", default="こんにちは", help="挨拶の言葉(デフォルト: こんにちは)")
def main(name, greeting):
print(f"{greeting}, {name}!")
if __name__ == "__main__":
main()
import typer
app = typer.Typer()
@app.command()
def main(name: str, greeting: str = "こんにちは"):
print(f"{greeting}, {name}!")
if __name__ == "__main__":
app()
サブコマンドを作成することも可能
import typer
app = typer.Typer()
@app.command()
def hello(name: str):
print(f"こんにちは, {name}!")
@app.command()
def good_morning(name: str):
print(f"おはよう, {name}!")
if __name__ == "__main__":
app()
個人的にはdataclassのfrozen=Trueとclick/typerが一番衝撃的だった。 Python3.12からのf文字のやつは、慣れの問題で結局取り扱いしづらいかも...
KDDIで行われたRAGによるデバイスサポートチャットの試行錯誤が綴られているスライド
勉強になったところだけ抜粋
普通のことではあるが、index登録時に入れるテキストを整形すること、特定性の高い情報はmetadataに入れておくとよいという感じか
世界一流エンジニアの思考法という本のまとめ的な内容を記した記事
個人的に勉強になった事項だけ抜粋
とくに10番が刺さった。時間がある身分なのでつい1日に設定した成果をベースにやってしまいがちだったが、これだと生産性向上という観点では成長しづらいなというのは確かに納得。。
日本語CLIP 学習済みモデルと評価用データセットの公開
LIONデータセットから日本語のみを抜き出したデータセットを用いて日本語に特化したCLIP作成の試みがまとめられている記事。
大規模データセットを用いた大規模モデルを学習する際の種々ノウハウが綴られている
既存モデルについて
rinna/japanese-clip-vit-b-16 は CC12M を和訳したもので学習が行われており、訓練データは1200万件と少ない
stabilityai/japanese-stable-clip-vit-l-16 もCC12MとSTAIR Captionsで学習されたものであり、学習サンプル数は比較的少ないため十分に訓練されていない可能性があります。
laion/CLIP-ViT-B-32-xlm-roberta-base-laion5B-s13B-b90k と laion/CLIP-ViT-H-14-frozen-xlm-roberta-large-laion5B-s13B-b90k は LAION-5B で学習されているため訓練データは50億件ですが、多言語で学習をされており、日本語に特化させたモデルを作成すれば日本語が関わるタスクにおいてはこれを上回る性能を達成できる可能性がある
学習周りの設定
OpenCLIPの多言語版 と イタリア語CLIP の事例を参考に実施
full scratch学習ではなく、画像エンコーダは laion/CLIP-ViT-B32-laion2B-s34B-b79k を、テキストエンコーダは rinna/japanese-roberta-base を使うように実装。
ただし、両エンコーダの出力の次元数は異なるため、テキストエンコーダの最後に線形層を追加。
学習結果
ロスが上がっているのに、下流タスクの性能は上がっているという現象に遭遇
また最終的な評価指標は以下のようになった。
意外なことに日本語に特化した学習を行なったものよりも、多言語データで学習したモデルの方が性能が高いという結果になっている。
また、ImagenetやFood101などの海外ドメイン由来のデータで日本語性能を評価することには注意が必要そうということがわかる。
実装に役立ったレポジトリ
Distributed Data Parallel (DDP)
DPとDDPの違いは複数GPUで学習するときのDP(Data Parallel)とDDP(Distributed Data Parallel)の違いが詳しい。
ざっくりうと、DDPはそれぞれのGPUごとにデータ読み込み/forward/backwardが独立して行われるが、DPはあるGPUが起点となってデータ読み込みやloss計算を管理・実行しているため、使えるならDDPを使った方が良い
サンプル学習コードは以下
ただし注意点もあり、
シーケンシャルアクセスによるデータローダーの最適化
大規模データセットでランダムアクセスをやろうとすると、ランダムアクセス自体のコストが嵩んでデータのGPUの計算に待ち時間が生まれることがある。
これを緩和するためのテクニックがシーケンシャルアクセスで
これをサポートしているライブラリがpytorchであればWebDataset, tensorflowであればTFRecord。
WebDatasetはその名の通り、web上のデータやクラウドストレージのデータも参照できるためさらに相性が良い。
ただしこれを正しく用いるためには、以下に注意する必要有り
確認はかなり大変そう。
コメント
本業でこういう規模のモデルを学習することはほぼないため、知らないことばかりだった。 ちなみにLoRAはうまくいかなかったとのこと。事前学習にはやっぱり向かないんだろうか。
出典