Open61

今日は機械学習ってやつを勉強していくぜぇ〜〜!!

levena_evenaslevena_evenas

モチベ

mjx(bertのコード)が全然分からずに萎えたため

https://python-basic.com/exam7/11/
あまりにも初心すぎて激萎えしており、python3エンジニア試験とかいう胡散臭い試験のデータ分析の更にその初級ぐらいが勉強にちょうどいいことに気づいてしまった(激萎え)

levena_evenaslevena_evenas

機械学習における微分は、最小値を求める際に利用します。scikit-learnを使えば微分を知らなくても学習モデルを作れますが、微分が分かると仕組みが理解できます。

scikit-learnのmodel学習には微分を使う

levena_evenaslevena_evenas

ベクトルは使う機会も多く、皆さん馴染みがあるかと思います。

ないが・・・

levena_evenaslevena_evenas

torch.tensor.backwardについて
backward()を使うにはtensor(, require_grad=true)が必要
あとtensorの第一引数がfloatである必要がある

kerasという文字列が見えたらtf

levena_evenaslevena_evenas

見せかけの回帰(suprious regression)と擬似相関(suprious correlation)は別物

そもそも回帰とは
回帰は変数間の関係をモデル化するために用いられる

目的変数==応答変数であり説明変数==特徴量である

levena_evenaslevena_evenas

回帰

回帰の種類には多重回帰、ロジスティック回帰や線形回帰、リッジ回帰などがある

https://avinton.com/academy/classification-regression/
回帰、分類は全部教師あり学習

線形回帰、漸化式っぽい。

分類はn個のデータがあってそれをクラスタリングする感じ。線形回帰はn個のデータをプロットして線を引く

levena_evenaslevena_evenas

連続的確率変数と離散的確率変数
連続的確率変数が気温で離散的確率変数がサイコロの目

levena_evenaslevena_evenas

確率関数と確率密度関数
確率関数は離散的確率変数の確立を求める
確率密度関数は連続的確率変数の確立を求める

levena_evenaslevena_evenas

回帰の評価指標・・・モデルのパフォーマンス計測で使われる。openevalとか?過学習の検知とかでも回帰の評価指標が使われる。

平均二乗誤差
平均絶対誤差
R二乗

levena_evenaslevena_evenas

https://drive.google.com/file/d/1vU7BCI1arG_ZyUYkAEvLi1LH1ou0pULu/view
https://x.com/miyashin_prg/status/1730150927158415409?s=20
セガが公開している基礎線形代数講座

線形代数を一言でいうと線形な(連続した)性質を持つ対象を代数の力で読み解く
自然数N
有理数Q(分数で表すことができる数)
1~2の間は無限に広がっていてこのような性質を稠密という

可算集合

https://ja.wikipedia.org/wiki/可算集合
自然数Nと濃度が等しい集合

集合Aのそれぞれの要素に対して集合Bの要素をひとつづつ定める規則のことをAからBへの写像という
集合Aを始集合(initial set)と呼び、集合Bを終集合(final set)と呼ぶ
写像の像・・・A{a}に対するB{b}

関数(集合)は始集合と終集合がともにRもしくはその部分集合からなる集合。Rはすべての実数の集合
実数には有理数と無理数が含まれるのでQとRとNはすべて別物。

写像の例: 1つのPCと1つのOSの組み合わせなど

levena_evenaslevena_evenas

多価関数(Multivalued Function)と1価関数(Single-valued Function)
多価関数は1対nの関数ということですか?->はいらしいです、gpt-3.5くんによると。

恒等写像・・・A->Aの写像

単射(injection)

levena_evenaslevena_evenas

シグモイド活性化関数

ReLuの仲間。
活性化関数の一つ。0~1の間の数を返す。出力層では一般的だが、隠れ層ではあまり使われない。

活性化関数

activation functionはnnの各ニューロンの出力を決定する関数。

levena_evenaslevena_evenas

DQNの実装サンプルより。

torch.nn.functional(通常 F としてインポートされる)は、PyTorchのニューラルネットワーク(NN)モジュールの一部で、さまざまな低レベルの関数を提供します。これらの関数は、ニューラルネットワークを構築する際に、レイヤーやアクティベーション関数、損失関数などの実装に使用されます。

nn.functional as Fのサンプル

  • 活性化関数・・・F.reluなど
    f.reluだったらnn.relu()でいいじゃんって思ったけどnn.ReLu()の中でnn.functional.ReLuを使ってるわ。

class nn.ReLu(nn.module):
のfoward()関数の中身がnn.functional.ReLu

  • 損失関数・・・損失関数はnnで重要な役割を果たしますが、これはnn内部ではなく、trainで使われる。
    nn.functional.mse_lossやtorch.nn.functional.cross_entropyなど。

  • 畳み込み層

levena_evenaslevena_evenas

torchのoptim.adamについて完全に理解してしまった人になった
optim.adamは基本勾配降下法なんですがadaとmoment法で改善した勾配降下法のアルゴリズムがoptim.adam
https://zero2one.jp/ai-word/problems-in-gradient-descent-methods/#:~:text=勾配降下法は誤差,がモメンタムやAdaGradです。
https://rightcode.co.jp/blog/information-technology/torch-optim-optimizer-compare-and-verify-update-process-and-performance-of-optimization-methods
学習率はtorchだとlr(learning rate)になる

levena_evenaslevena_evenas

https://www.youtube.com/watch?v=xRpyzG2AVTM
シグモイド関数についてわかりやすくてよかった。

  • LeRu関数が優れている点として、勾配消失問題が起きにくい。
    • 勾配消失問題・・・微分を重ねすぎて勾配がどんどん小さくなり、消失してしまう(層の重みが0に近づいてしまう。
  • シグモイド関数は0~1の間を取る関数だが、勾配消失問題が起こりやすい。
  • シグモイド関数は微分値の最大値が0.25になる
    • シグモイド関数は入力が負の値であれば0~0.25になり、入力が大きい場合1に近づく、負になるにしたがって0に近づくし、でかくなるにしたがって1に近づく。
levena_evenaslevena_evenas

LLMのサイズ数
モデルのパラメータ数*バイト数
例えばOpenCaLMだと68億なので68億(10*9)(7B)*float32(4Byte)=28GB
FTしようとなったら追加でさらにGPUmemが必要。FTでは誤差伝播法で勾配を計算する。そのために大体LLMと同じぐらいのメモリが追加で必要なのでopencalmのfull-fine tuningをするには50GB必要

levena_evenaslevena_evenas

CNNの劣化問題

cnnの劣化問題を解決するためにresnetが生まれた。
cnnの20層より56層のほうが学習データでもテストデータでも精度が悪くなっている。
resnetは恒等写像をしやすくするテクニック
https://www.youtube.com/watch?v=kup8FDLkk5o

levena_evenaslevena_evenas

StreamDiffusionのpaper読んでたらそもそもdiffusion model(拡散モデル)の理解を求められた

levena_evenaslevena_evenas

unetはu字になってるからu-net
https://hoshikat.hatenablog.com/entry/2023/03/31/022605
https://hoshikat.hatenablog.com/entry/2023/04/03/215537
in0~in11で畳み込みを行う、畳み込みを行うときに4チャンネル存在する(rgb+stable diffusion特有の)
このチャンネルを全部足す。そうすると最初の入力への類似度的なのが一つになって出てくる。

in0ブロックは320個の特徴発見機を持っている。

実際のStable DiffusionはLatent Spaceという画像圧縮を使うので、厳密には画像データではありませんが。

GANは敵対性生成ネットワークの生成側、generatorに着目し、入力データをイメージに変換するプロセスを解明した。
ganはgeneratorが生成した画像をdescriminatorが真偽を判定して制度を上げる
入力データデータはランダムなベクトルで構成され、latent spaceと呼ばれる
健在空間、latent space
健在空間は通常、高次元なデータ(音声や画像)を低次元で表現するために使用されます。オートエンコーダのようなモデルは入力をlatent spaceにエンコードして潜在空間からdecodeする
潜在空間はvaeにおいても重要です。

lcmはlatent consistency modelの略。潜在一貫性モデル。画質を多少犠牲にすることで信じられないほど高速化する仕組み

stable diffusionはldmという仕組みをベースにしている。sampling step数でランダムなノイズを入れてそれを除去するやつ
webuiで見てみるとわかるが、sampling step数はデフォルトの20ぐらいが最適。9ぐらいからノイズが消えて「絵」になる。30ぐらいだと絵柄が変わってしまう。

lcmはstep数が8ぐらいで安定している。

sdxl-tarboはaddという技術を使っている。adversaral diffution distillation、敵対的拡散蒸留

tensorrtはtensor run time。nvidiaが開発したstable diffusionのmodelをRTX gpu上で最高のパフォーマンスで利用するためのもの。

pytorchなどのdlフレームワークで訓練されたモデルを取り込みそれを最適化して推論を効果的に行うことが出来るもの。

levena_evenaslevena_evenas

日記:
今日はgguf量子化を試しました。
ggufにするにはllama2のconvert-hf-to-gguf.pyを使うみたいです。
hfからmodelを持ってきた後ggufに変換して、そのあと量子化する。つまりgguf化と量子化はまた別。
https://note.com/educator/n/n56f9acf01d2c
https://ayousanz.hatenadiary.jp/entry/2023/12/23/230539

 python ../convert-hf-to-gguf.py phi-2/
../quantize phi-2/ggml-model-f16.gguf phi-2/ggml-model-q4_0.gguf q4_0
../main phi-2/ggml-model-q4_0.gguf -p "what about 1+1"

nekomata14bは

error loading model: create_tensor: tensor 'token_embd.weight' not found
llama_load_model_from_file: failed to load model
llama_init_from_gpt_params: error: failed to load model 'models/nekomata-14b-q4_0.gguf'

と言われた。

levena_evenaslevena_evenas

今日はvllmを動かした
macでもwindowsでもpoetryやryeを使うと何故か動かなかった。諦めて生pip installをするとうまく動いた
https://note.com/hamachi_jp/n/nfd976007dbd1
windowsもだめ、こける

Administrator in ~ via  v21.4.0
❯ pip install vllm
Collecting vllm
  Using cached vllm-0.2.6.tar.gz (167 kB)
  Installing build dependencies ... done
  Getting requirements to build wheel ... error
  error: subprocess-exited-with-error

  × Getting requirements to build wheel did not run successfully.
  │ exit code: 1
  ╰─> [22 lines of output]
      C:\Users\Owner\AppData\Local\Temp\pip-build-env-h1dt3he5\overlay\Lib\site-packages\torch\nn\modules\transformer.py:20: UserWarning: Failed to initialize NumPy: No module named 'numpy' (Triggered internally at ..\torch\csrc\utils\tensor_numpy.cpp:84.)
        device: torch.device = torch.device(torch._C._get_default_device()),  # torch.device('cpu'),
      No CUDA runtime is found, using CUDA_HOME='C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.2'
      Traceback (most recent call last):
        File "C:\ProgramData\anaconda3\Lib\site-packages\pip\_vendor\pyproject_hooks\_in_process\_in_process.py", line 353, in <module>
          main()
        File "C:\ProgramData\anaconda3\Lib\site-packages\pip\_vendor\pyproject_hooks\_in_process\_in_process.py", line 335, in main
          json_out['return_val'] = hook(**hook_input['kwargs'])
                                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        File "C:\ProgramData\anaconda3\Lib\site-packages\pip\_vendor\pyproject_hooks\_in_process\_in_process.py", line 118, in get_requires_for_build_wheel
          return hook(config_settings)
                 ^^^^^^^^^^^^^^^^^^^^^
        File "C:\Users\Owner\AppData\Local\Temp\pip-build-env-h1dt3he5\overlay\Lib\site-packages\setuptools\build_meta.py", line 325, in get_requires_for_build_wheel
          return self._get_build_requires(config_settings, requirements=['wheel'])
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        File "C:\Users\Owner\AppData\Local\Temp\pip-build-env-h1dt3he5\overlay\Lib\site-packages\setuptools\build_meta.py", line 295, in _get_build_requires
          self.run_setup()
        File "C:\Users\Owner\AppData\Local\Temp\pip-build-env-h1dt3he5\overlay\Lib\site-packages\setuptools\build_meta.py", line 311, in run_setup
          exec(code, locals())
        File "<string>", line 298, in <module>
        File "<string>", line 268, in get_vllm_version
      NameError: name 'nvcc_cuda_version' is not defined. Did you mean: 'cuda_version'?
      [end of output]

  note: This error originates from a subprocess, and is likely not a problem with pip.
error: subprocess-exited-with-error

× Getting requirements to build wheel did not run successfully.
│ exit code: 1
╰─> See above for output.

note: This error originates
levena_evenaslevena_evenas

swallow-7bの実行

llm-jp-evalのためにswallow-7bをlocalに持ってきた。
sentencepieceが無い状態で推論すると下記のエラーが出た。下記のコマンドを打つとうまく動いた。

pip install sentencepiece accelerate protobuf
root@DESKTOP-2TQ96U5:/mnt/c/Users/Owner/work/private/ai/LLM/llm-jp-eval2# python swallow-sample.py 
Traceback (most recent call last):
  File "/mnt/c/Users/Owner/work/private/ai/LLM/llm-jp-eval2/swallow-sample.py", line 6, in <module>
    tokenizer = AutoTokenizer.from_pretrained("./Swallow-7b-instruct-hf")
                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/root/.anyenv/envs/pyenv/versions/3.11.4/lib/python3.11/site-packages/transformers/models/auto/tokenization_auto.py", line 787, in from_pretrained
    return tokenizer_class.from_pretrained(pretrained_model_name_or_path, *inputs, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/root/.anyenv/envs/pyenv/versions/3.11.4/lib/python3.11/site-packages/transformers/tokenization_utils_base.py", line 2028, in from_pretrained
    return cls._from_pretrained(
           ^^^^^^^^^^^^^^^^^^^^^
  File "/root/.anyenv/envs/pyenv/versions/3.11.4/lib/python3.11/site-packages/transformers/tokenization_utils_base.py", line 2260, in _from_pretrained
    tokenizer = cls(*init_inputs, **init_kwargs)
                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/root/.anyenv/envs/pyenv/versions/3.11.4/lib/python3.11/site-packages/transformers/models/llama/tokenization_llama_fast.py", line 124, in __init__
    super().__init__(
  File "/root/.anyenv/envs/pyenv/versions/3.11.4/lib/python3.11/site-packages/transformers/tokenization_utils_fast.py", line 120, in __init__
    raise ValueError(
ValueError: Couldn't instantiate the backend tokenizer from one of: 
(1) a `tokenizers` library serialization file, 
(2) a slow tokenizer instance to convert or 
(3) an equivalent slow tokenizer class to instantiate and convert. 
You need to have sentencepiece installed to convert a slow tokenizer to a fast one.

vmには100GBぐらいほしい

levena_evenaslevena_evenas

llm-jp-eval

root@DESKTOP-2TQ96U5:/mnt/c/Users/Owner/work/private/ai/LLM/llm-jp-eval2# CUDA_VISIBLE_DEVICES=0 python scripts/evaluate_llm.py -cn config.yaml model.pretrained_model_name_or_path=Swallow-7b-instruct-hf tokenizer.pretrained_model_name_or_path=Swallow-7b-instruct-hf dataset_dir=sample/1.1.0/evaluation/test/
git clone git@hf.co:tokyotech-llm/Swallow-7b-instruct-hf
python swallow-sample.py
python scripts/preprocess_dataset.py --dataset-name all --output-dir sample
root@DESKTOP-2TQ96U5:/mnt/c/Users/Owner/work/private/ai/LLM/llm-jp-eval2# CUDA_VISIBLE_DEVICES=0 python scripts/evaluate_llm.py -cn config.yaml model.pretrained_model_name_or_path=Swallow-7b-instruct-hf tokenizer.pretrained_model_name_or_path=Swallow-7b-instruct-hf dataset_dir=sample/1.1.0/evaluation/test/
[2023-12-30 07:34:52,696][accelerate.utils.modeling][INFO] - We will use 90% of the memory on device 0 for storing the model, and 10% for the buffer to avoid OOM. You can set `max_memory` in to a higher value to use more memory (at your own risk).
Loading checkpoint shards: 100%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 3/3 [04:32<00:00, 90.99s/it]
jamp:   0%|                                                                                                                                                                                                                                         | 0/100 [00:00<?, ?it/s]wandb: (1) Create a W&B account
wandb: (2) Use an existing W&B account
wandb: (3) Don't visualize my results
wandb: Enter your choice: 3
wandb: You chose "Don't visualize my results"
wandb: W&B syncing is set to `offline` in this directory.  
wandb: Run `wandb online` or set WANDB_MODE=online to enable cloud syncing.
wandb: Streaming LangChain activity to W&B at 
wandb: `WandbTracer` is currently in beta.
wandb: Please report any issues to https://github.com/wandb/wandb/issues with the tag `langchain`.
Setting `pad_token_id` to `eos_token_id`:2 for open-end generation.
jamp:   1%|██▎                                                                                                                                                                                                                              | 1/100 [00:18<30:46, 18.65s/it]Setting `pad_token_id` to `eos_token_id`:2 for open-end generation.
jamp:   2%|████▌                                                  
levena_evenaslevena_evenas

llmの性能評価

  • llm-open-eval
  • JP Language Model Evaluation Harness(commit #9b42d41)
  • ELYZA-tasks-100
  • Japanese MT-bench

LLM-as-a-judge

マイナー

  • MLflow

  • OpenAIのEvals

  • oasst-model-eval

  • JGLUE

  • Japanese Vicuna QA Benchmark

    • MT-Bench の前身である vicuna-blog-eval の日本語版。一般、知識、ロールプレイ、常識、フェルミ推定、反実仮想、コーディング、数学、ライティングに関する 80 問の質問を収録している。
  • https://huggingface.co/datasets/yuzuai/rakuda-questions?row=3

  • GLUE(General Language Understanding Evaluation)

    • 自然言語処理(NLP)モデルの性能を評価するための標準ベンチマークです(英語のみ)。
    • 日本語向けとしてJGLUEがあります(日本語NLP評価用にGLUEを参考に一から作り直したもの)。

ref

https://github.com/llm-jp/awesome-japanese-llm?tab=readme-ov-file
https://zenn.dev/pakas/articles/80f797b0c3ae1e
https://qiita.com/DeepTama/items/fca52f2289a1c8fa5405

levena_evenaslevena_evenas

sdについて
普通はノイズを入れてから除去するというのを一ピクセルごとにやるので256¥*256=65535回計算が必要なんですが、ガチャガチャして潜在空間にしてから潜在変数にだけ計算を行う、その後少し小さい潜在空間に戻す、これを何回もやるのがu-net

levena_evenaslevena_evenas

あとはひたすらtransformerやpeftなどを実装して表面だけ撫でています

levena_evenaslevena_evenas

https://ayousanz.hatenadiary.jp/entry/2023/12/21/113228
nekomata-14bのtransformerの量子化読み込みに苦労している

## 出てきた謎のエラーたち
* FP4 quantization state not initialized. Please call .cuda() or .to(device) on the LinearFP4 layer first.
* The model is automatically converting to bf16 for faster inference. If you want to disable the automatic precision, please manually add bf16/fp16/fp32=True to "AutoModelForCausalLM.from_pretrained".
* ValueError: `.to` is not supported for `4-bit` or `8-bit` bitsandbytes models. Please use the model as it is, since the model has already been set to the correct devices and casted to the correct `dtype`.
* You shouldn't move a model when it is dispatched on multiple devices.
* The model is automatically converting to bf16 for faster inference. If you want to disable the automatic precision, please manually add bf16/fp16/fp32=True to "AutoModelForCausalLM.from_pretrained".
* FP4 quantization state not initialized. Please call .cuda() or .to(device) on the LinearFP4 layer first.
levena_evenaslevena_evenas

https://www.youtube.com/watch?v=BFpu9Ac7sic
オタクは2回見る
ガウス分布=正規分布
diffusionモデルでは入力画像をx0と書いてxtはノイズ状態
foword process
x^0が予測画像(出力画像)
イラストを生成するとき:ノイズから画像を作るわけだが
Xt-1=√αt Xt+√βt εt(ノイズ)

https://hoshikat.hatenablog.com/entry/2023/06/30/212231

stable diffusion本家は1000ステップぐらいで学習してる

diffusionmodelのデノイジングを理解するにはODEの理解が必要
ODEは常微分方程式のこと。常微分方程式は未知の関数Xとそれの微分が与えられた方程式。
https://www2.yukawa.kyoto-u.ac.jp/~norihiro.tanahashi/pdf/ODE/note_1.pdf
https://ja.wikipedia.org/wiki/常微分方程式
微分の全てを忘れたためまた導関数からやり直したほうがいい説が高い
https://rikedan-blog.com/これを読めば完璧!常微分方程式のすべて大学数/

t_index_listはゆらゆらしてて次元数はステップ数なんですね

そのうちやりたい→t_index_listの1つめのステップ数の最初の推論した画像を抜いてくることもできる

22分20s
f0==u-netを指している

sdのデフォルトは512512なので6464に落としている(再度)
latent diffusion model=元画像をlatent 空間に落としてノイズを加えて戻す
Latent Consistency Model=


tensorRT

https://github.com/NVIDIA/TensorRT/tree/main/samples/python/network_api_pytorch_mnist

levena_evenaslevena_evenas

ordinary differentail equation以外にもSDEもある。
この辺はautomaticのサンプラーの種類とかにかかわってくる。DDIMとかEulerとか。
Eulerが最も基本的な常微分方程式。Eulerはオイラー

levena_evenaslevena_evenas

今日はdiffusersに入門してますわ
kanachanだけに構っててはいけませんのでね。

  • stablediffusionpipelineを使って動かす
  • load_lora_wheightとfuse_loraを使って適用
  • 速度調査など