GENZITSU / UsefulMaterials

34 stars 0 forks source link

almost weekly useful materials - 05/31 - #133

Open GENZITSU opened 1 year ago

GENZITSU commented 1 year ago

PtitPrinceによるPythonでのRaincloud plotの描画

表題の通り

以下のようなRaincloud plotを描画することができる。

スクリーンショット 2023-05-03 22 29 55

コメント

seabornのviolin plotでも似たような図は書けるけど、ヒストグラムと点が別々に描画されている分こっちの方が見やすいケースもありそう

出典

GENZITSU commented 1 year ago

[2023年最新版]Python案件で汎用的に使えるモダンなプロジェクトテンプレート

参考になった部分だけ抜粋

ディレクトリ構成

├── .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/をルートに作ってそこに書きそう

logger configの書き方

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と普通の文で切り替え可能にしておくのはなかなか良さそう。

タスクランナーとしてのMakefile

# install
.PHONY: install
install:
    pyenv install 3.10
    poetry env use 3.10
    poetry install
    pre-commit install

ちゃんと知らなかったけど .PHONYでダミーターゲットを作っているのが味噌っぽい。

コメント

参考になった。

出典

GENZITSU commented 1 year ago

Instruct-NeRF2NeRF

テキスト指示でNeRFを編集する論文の紹介スライド

スライド中で紹介されていたてInstruct-Pix2Pixの内容が興味深かったのでメモ

データセットの作成方法

編集指示文と編集前後の画像キャプションを自動的に作成するために、GPT3を利用。

700個のシードデータセットから編集指示文と、編集前後の画像キャプション生成機を作成、ここで生成されたものをstable diffusionを用いて、編集指示文による画像編集のデータセットを作成

スクリーンショット 2023-05-06 10 40 01

Prompt2Prompt

編集指示をしていない部分の構図を変更させないようにするための技術。拡散過程におけるattentionの変化に着目することで、stepの早い段階で構図が確定していることを確認。あるステップ以上のattentionを元画像に置き換えることで構図の変化を防止

スクリーンショット 2023-05-06 10 42 41

スクリーンショット 2023-05-06 10 42 51

スクリーンショット 2023-05-06 10 42 58

コメント

データセットの作成部分が非常に興味深かった。いまやchatgptも出てきているので、こういう半教師あり的なデータ生成方法はデファクトになっていきそう。
一方で、LLMの出力はあくまで確率的なので、再現性がどれくらいあるかは要注意かも知れない。明らかに問題のあるデータセットは目視で弾けるが、データセットの多様性や質の問題はチェックが難しそう。

出典

GENZITSU commented 1 year ago

Scaling up the Prime Video audio/video monitoring service and reducing costs by 90%

プライムビデオのストリーム品質モニタリングシステムを分散マイクロサービスからECS taskに変更することでコストを10分の1にできたという事例の共有。監視対象が増えるにつれて、Step Functionsの制限に引っかかったり、中間S3からのデータ転送コストが増大した結果、シングルインスタンス上で一括処理する構成に変更したとのこと。

最初の構成

スクリーンショット 2023-05-06 11 24 48

ストリームで流れているビデオをフレームごとに分割して、s3に置いておき、品質劣化を判定するdetecotrがそれらをDLし処理していくという構成。このワークフロー全体をStep Functionsで管理していた。

問題点

このシステムでは、短時間に複数の状態遷移が発生するのでStep Functionsの状態遷移回数上限にすぐ引っかかってしまったというのと、状態遷移ごとに発生する課金がバカにならなかったとのこと。 また、中間S3からのデータ転送コストがめちゃくちゃ高かったとのこと。

リアーキテクト後の構成

一つのECS taskで処理するように変更することで、Step Functions や中間S3を使わないように変更。これにより、rate limitやデータ転送が不要に。 detectorだけを並列化させようとしていた構成から、このECS taskを並列化することで、トラフィックを全て捌けるように変更。

スクリーンショット 2023-05-06 11 34 03

スクリーンショット 2023-05-06 11 34 38

コメント

トラフィックがめちゃくちゃ増えることで、モノリスに回帰したという事例が、microservice / serverlessの先鋒AWS自身から出てきたというのが面白い。

ぶっちゃけ、ネットワーク負荷がクソ重そうな、ビデオをマイクロサービスで分散処理するという発想がそもそも良くなかったという説はある。記事中ではdetector部分を並列化するためにmicorservice化して柔軟なスケーリングを可能にしたかったと書かれていたが、そこがすでに間違いなような...? (早く裁くために並列化しても結局データ転送の金銭的/時間的コストの方が高くなりそうな...?)

出典

GENZITSU commented 1 year ago

pandas-ai

pandasのDataFrame操作をpromptを通じて行えるようにするライブラリ

OpenAI or StarcoderのAPIを利用して、promptに入力されたDataFrame操作を行うコードを生成させ、それを実行することで結果を得ている。

スクリーンショット 2023-05-09 23 40 26

スクリーンショット 2023-05-09 23 40 39

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.
    """

コメント

プロンプト芸で

出典

GENZITSU commented 1 year ago

LLMをゼロからトレーニングするためのベストプラクティス

W&Bから公開されたLLMをトレーニングするための

コメント

出典

GENZITSU commented 11 months ago

Numbers every LLM Developer should know

LLM開発者が知っておくべき様々な数字をまとめてくれているGithub

スクリーンショット 2023-05-26 9 50 30

特に重要そうな数字だけ抜粋

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メモリ系の話は触ってないと相場間がわからないため助かる人多そう。

出典

GENZITSU commented 11 months ago

【$13,000→$5,000】AWS S3 コスト削減!! オブジェクト削減とS3 Standardから Glacier Instant Retrievalへの移行

表題の通り

重要なポイントだけ抜粋

現状の確認方法

実施したコスト削減対策

スクリーンショット 2023-05-26 10 06 56

コメント

今後自分がコスト削減する時に参考になりそう

出典

GENZITSU commented 11 months ago

QLORAをgoogle colabで試してみた。

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相当らしいので、ちゃんとチューニングすれば使い物になるかも?

スクリーンショット 2023-05-26 10 30 44

出典

GENZITSU commented 11 months ago

高速で持続可能な開発のためのソフトウェア工学と機械学習への適用

高速で正確なソフトウェアを開発するためのベストプラクティスを紹介し、機械学習開発にどのように適用できるかを論じている記事

ためになった部分だけ抜粋

ソフトウェア開発の独特な性質 = 要求が逐次的に変化する、柔軟に編集できる、複雑性に上限がない、

高速で正確なソフトウェアを開発するためのベストプラクティス

機械学習開発においては

コメント

数ある問題の中でも待ち時間の長さはとりわけ重要なので、色々対策考えておきたい。

出典