Open GENZITSU opened 1 year ago
参考になった部分だけ抜粋
├── .env # 環境変数用ファイル(git管理外のため、.env.exampleからコピーする)
├── .env.example # 環境変数用ファイルのサンプル
├── .env.prd # 環境変数用ファイルの本番環境用
├── .pre-commit-config.yaml # pre-commit設定ファイル
├── LICENSE.md
├── Makefile # タスクランナーの定義に使用
├── Readme.md
├── mypy.ini # mypyの設定ファイル
├── poetry.lock # poetyrのlockファイル
├── pyproject.toml # project全体の設定ファイル
├── requirements-dev.txt # poetryを使用しない場合のrequirements.txt(開発環境用)
├── requirements.txt # poetryを使用しない場合のrequirements.txt
├── src # mainのソースコード
│ ├── common # 全体で使用する処理をまとめたディレクトリ
│ │ ├── __init__.py
│ │ ├── configs.py # ソースコード全体で使用する設定の管理
│ │ └── logger.py # logger管理用
│ ├── logger_config.yaml # logging設定ファイル
│ ├── main.py # サンプルのmain
│ └── sub.py # サンプルのsub関数
└── tests # テストコード格納用のディレクトリ
├── conftest.py
└── sub
├── __init__.py
├── conftest.py
└── test_sub.py
.envはルートディレクトリに配置している。自分はenvs/
下に押し込みそう
src/common
の中にconfigsとかloggerとかを入れているが、自分はconfigs/
をルートに作ってそこに書きそう
version: 1
disable_existing_loggers: false
formatters:
json:
format: "%(asctime)s %(name)s %(levelname)s %(message)s %(filename)s %(module)s %(funcName)s %(lineno)d"
class: pythonjsonlogger.jsonlogger.JsonFormatter
normal:
format: "[%(asctime)s - %(levelname)s - %(filename)s(func:%(funcName)s, line:%(lineno)d)] %(message)s"
handlers:
console:
class: logging.StreamHandler
level: INFO
formatter: normal # json形式にしたい場合はjsonと記述する
stream: ext://sys.stdout
loggers:
src:
level: INFO
handlers: [console]
propagate: false
root:
level: INFO
handlers: [console]
ちゃんと仕方書き方がよくわかっていないので、一つの書き方としてメモ。 formatterをjsonと普通の文で切り替え可能にしておくのはなかなか良さそう。
# install
.PHONY: install
install:
pyenv install 3.10
poetry env use 3.10
poetry install
pre-commit install
ちゃんと知らなかったけど .PHONY
でダミーターゲットを作っているのが味噌っぽい。
参考になった。
テキスト指示でNeRFを編集する論文の紹介スライド
スライド中で紹介されていたてInstruct-Pix2Pixの内容が興味深かったのでメモ
編集指示文と編集前後の画像キャプションを自動的に作成するために、GPT3を利用。
700個のシードデータセットから編集指示文と、編集前後の画像キャプション生成機を作成、ここで生成されたものをstable diffusionを用いて、編集指示文による画像編集のデータセットを作成
編集指示をしていない部分の構図を変更させないようにするための技術。拡散過程におけるattentionの変化に着目することで、stepの早い段階で構図が確定していることを確認。あるステップ以上のattentionを元画像に置き換えることで構図の変化を防止
データセットの作成部分が非常に興味深かった。いまやchatgptも出てきているので、こういう半教師あり的なデータ生成方法はデファクトになっていきそう。
一方で、LLMの出力はあくまで確率的なので、再現性がどれくらいあるかは要注意かも知れない。明らかに問題のあるデータセットは目視で弾けるが、データセットの多様性や質の問題はチェックが難しそう。
プライムビデオのストリーム品質モニタリングシステムを分散マイクロサービスからECS taskに変更することでコストを10分の1にできたという事例の共有。監視対象が増えるにつれて、Step Functionsの制限に引っかかったり、中間S3からのデータ転送コストが増大した結果、シングルインスタンス上で一括処理する構成に変更したとのこと。
ストリームで流れているビデオをフレームごとに分割して、s3に置いておき、品質劣化を判定するdetecotrがそれらをDLし処理していくという構成。このワークフロー全体をStep Functionsで管理していた。
このシステムでは、短時間に複数の状態遷移が発生するのでStep Functionsの状態遷移回数上限にすぐ引っかかってしまったというのと、状態遷移ごとに発生する課金がバカにならなかったとのこと。 また、中間S3からのデータ転送コストがめちゃくちゃ高かったとのこと。
一つのECS taskで処理するように変更することで、Step Functions や中間S3を使わないように変更。これにより、rate limitやデータ転送が不要に。 detectorだけを並列化させようとしていた構成から、このECS taskを並列化することで、トラフィックを全て捌けるように変更。
トラフィックがめちゃくちゃ増えることで、モノリスに回帰したという事例が、microservice / serverlessの先鋒AWS自身から出てきたというのが面白い。
ぶっちゃけ、ネットワーク負荷がクソ重そうな、ビデオをマイクロサービスで分散処理するという発想がそもそも良くなかったという説はある。記事中ではdetector部分を並列化するためにmicorservice化して柔軟なスケーリングを可能にしたかったと書かれていたが、そこがすでに間違いなような...? (早く裁くために並列化しても結局データ転送の金銭的/時間的コストの方が高くなりそうな...?)
pandasのDataFrame操作をpromptを通じて行えるようにするライブラリ
OpenAI or StarcoderのAPIを利用して、promptに入力されたDataFrame操作を行うコードを生成させ、それを実行することで結果を得ている。
promptの設定が参考になる
# from https://github.com/gventuri/pandas-ai/blob/main/pandasai/__init__.py
_task_instruction: str = """
Today is {today_date}.
You are provided with a pandas dataframe (df) with {num_rows} rows and {num_columns} columns.
This is the result of `print(df.head({rows_to_display}))`:
{df_head}.
Return the python code (do not import anything) and make sure to prefix the requested python code with {START_CODE_TAG} exactly and suffix the code with {END_CODE_TAG} exactly to get the answer to the following question:
"""
_response_instruction: str = """
Question: {question}
Answer: {answer}
Rewrite the answer to the question in a conversational way.
"""
_error_correct_instruction: str = """
Today is {today_date}.
You are provided with a pandas dataframe (df) with {num_rows} rows and {num_columns} columns.
This is the result of `print(df.head({rows_to_display}))`:
{df_head}.
The user asked the following question:
{question}
You generated this python code:
{code}
It fails with the following error:
{error_returned}
Correct the python code and return a new python code (do not import anything) that fixes the above mentioned error. Do not generate the same code again.
Make sure to prefix the requested python code with {START_CODE_TAG} exactly and suffix the code with {END_CODE_TAG} exactly.
"""
プロンプト芸で
LLM開発者が知っておくべき様々な数字をまとめてくれているGithub
特に重要そうな数字だけ抜粋
40-90%1: Amount saved by appending “Be Concise” to your prompt
"Be Concise"をつけると出力が簡略化され、トークン数の節約になる
1.3:1 -- Average tokens per word
1 wordは大体1.3 token, 日本語は単語単位ではなく文字単位になりがりなので注意
2x number of parameters: Typical GPU memory requirements of an LLM for serving
7B級のモデルであれば、大体14GBのGPUメモリーが必要ということ
~1 MB: GPU Memory required for 1 token of output with a 13B parameter model
13B級のパラメータで1 tokenを出力するのに必要なGPUメモリ量は1MB.
openaiのAPIの価格に関する話題が多かったけど、後半のGPUメモリ系の話は触ってないと相場間がわからないため助かる人多そう。
表題の通り
重要なポイントだけ抜粋
現状の確認方法
実施したコスト削減対策
3.2 ストレージ階層の移行
3.3 細かいオブジェクトの束ね作業
今後自分がコスト削減する時に参考になりそう
QLoRAは論文だけじゃなくて、実装も一緒に公開されてたのか…(驚き 現状は以下のモデルをサポート
[
'bigbird_pegasus', 'blip_2', 'bloom', 'bridgetower', 'codegen', 'deit', 'esm',
'gpt2', 'gpt_bigcode', 'gpt_neo', 'gpt_neox', 'gpt_neox_japanese', 'gptj', 'gptsan_japanese',
'lilt', 'llama', 'longformer', 'longt5', 'luke', 'm2m_100', 'mbart', 'mega', 'mt5', 'nllb_moe',
'open_llama', 'opt', 'owlvit', 'plbart', 'roberta', 'roberta_prelayernorm', 'rwkv', 'switch_transformers',
't5', 'vilt', 'vit', 'vit_hybrid', 'whisper', 'xglm', 'xlm_roberta'
]
4bitでの読み込み & ファインチューニングが可能なようですが、出力は流石に微妙っぽい
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig
model_id = "EleutherAI/gpt-neox-20b"
bnb_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_use_double_quant=True,
bnb_4bit_quant_type="nf4",
bnb_4bit_compute_dtype=torch.bfloat16
)
tokenizer = AutoTokenizer.from_pretrained(model_id)
model_4bit = AutoModelForCausalLM.from_pretrained(model_id, quantization_config=bnb_config, device_map="auto")
import torch
from transformers import AutoTokenizer, AutoModelForCausalLM, BitsAndBytesConfig
model_id = "EleutherAI/gpt-neox-20b"
bnb_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_use_double_quant=True,
bnb_4bit_quant_type="nf4",
bnb_4bit_compute_dtype=torch.bfloat16
)
tokenizer = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForCausalLM.from_pretrained(model_id, quantization_config=bnb_config, device_map={"":0})
# apply peft model
from peft import prepare_model_for_kbit_training
from peft import LoraConfig, get_peft_model
model.gradient_checkpointing_enable()
model = prepare_model_for_kbit_training(model)
config = LoraConfig(
r=8,
lora_alpha=32,
target_modules=["query_key_value"],
lora_dropout=0.05,
bias="none",
task_type="CAUSAL_LM"
)
model = get_peft_model(model, config)
よくよく調べてみたら、もともと論文よりも先に実装を紹介するものだったみたい。 元ツイ
Elo ratingベースではChatgpt相当らしいので、ちゃんとチューニングすれば使い物になるかも?
高速で正確なソフトウェアを開発するためのベストプラクティスを紹介し、機械学習開発にどのように適用できるかを論じている記事
ためになった部分だけ抜粋
ソフトウェア開発の独特な性質 = 要求が逐次的に変化する、柔軟に編集できる、複雑性に上限がない、
数ある問題の中でも待ち時間の長さはとりわけ重要なので、色々対策考えておきたい。
PtitPrinceによるPythonでのRaincloud plotの描画
表題の通り
以下のようなRaincloud plotを描画することができる。
コメント
seabornのviolin plotでも似たような図は書けるけど、ヒストグラムと点が別々に描画されている分こっちの方が見やすいケースもありそう
出典