2024年5月31日金曜日

ツイート情報を LoRA に学習させるためのフォーマットに変換する

ツイート情報を LoRA に学習させるためのフォーマットに変換する

概要

過去に mlx で LoRA 学習をしました今回はツイートのアーカイブデータを学習させられるように加工してみました

環境

  • macOS 11.7.10
  • Python 3.11.6

準備

  • pip install pandas scikit-learn

サンプルコード

基本的な作成の流れは前回と同じです
成果物も json ファイル 3 つになります

ツイートのアーカイブ情報にはいろいろありますが今回は full_text のみ学習させます

命令も単純に「ツイートして」にしていますが本来であれば時刻やそのツイートに関するコンテキストも命令に与えたほうがいいです

import json
from io import StringIO

import pandas as pd
from sklearn.model_selection import train_test_split

# tweets.js を読み込んでツイート情報を辞書に変換
tweets = []
with open("./tweets.js", mode="r") as f:
    for tweet in json.loads(f.read().replace("window.YTD.tweets.part0 = ", "")):
        t = {
            "full_text": tweet["tweet"]["full_text"],
            "created_at": tweet["tweet"]["created_at"],
        }
        tweets.append(t)

# JSONデータをPandas DataFrameに読み込む
df = pd.read_json(StringIO(json.dumps(tweets)))
pd.set_option("display.max_colwidth", 1000)
pd.set_option("display.max_rows", 1000)

# リンクを含むツイートは削除
df = df[~df["full_text"].str.contains("https://")]

print(df.head(100))

# テキスト長が短い学習データTOP1300をデータセットとして扱う
# 学習に時間がかかる場合もしくはメモリを使いすぎる場合は ascending=True にして短い順にするか 1300 の数を小さくすること
df["length"] = df.full_text.str.len()
df = df.sort_values(by="length", ascending=False)
df = df.head(1300)

# データフレームをシャッフル
df = df.sample(frac=1).reset_index(drop=True)

# validとtest用のデータを100件ずつ取り出し、残りをtrainに分割
valid_df, remaining_df = train_test_split(df, test_size=len(df) - 100, random_state=42)
test_df, train_df = train_test_split(
    remaining_df, test_size=len(remaining_df) - 100, random_state=42
)


# ヘルパー関数:データフレームを新しい形式でJSON Linesファイルに変換
def df_to_jsonl(df, file_name):
    with open(file_name, "w", encoding="utf-8") as file:
        for _, row in df.iterrows():
            formatted_data = {"text": f"USER:ツイートして ASSISTANT:{row['full_text']}"}
            file.write(json.dumps(formatted_data, ensure_ascii=False) + "\n")


# 各データセットを対応するJSON Linesファイルに変換
df_to_jsonl(train_df, "./train.jsonl")
df_to_jsonl(valid_df, "./valid.jsonl")
df_to_jsonl(test_df, "./test.jsonl")

トラブルシューティング

pandas を使う場合は pipenv 配下だとエラー (Segmentation fault) になります
なので pip でインストールしてその配下で使いましょう

最後に

次回はこのデータを使って MLX + LoRA をしてみたいと思います

2024年5月30日木曜日

LoRA 学習用の 512x512 画像を作成する方法

LoRA 学習用の 512x512 画像を作成する方法

概要

流れを紹介します
基本は外部のサービスを使うので将来的にサービスがなくなっている可能性があるので注意してください
その場合は代替サービスを探してください
流れ的には同じことをすれば OK です

環境

  • macOS 11.7.10
  • FireAlpaca 2.11.10

サイズを調整する

まずはざっくり調整します
512 に近づくように拡大 or 縮小します

https://www.waifu2x.net/

512 に変更する

先ほど 512 に近づけたファイルを使って 512 にサイズ指定して変更します
元々 512 に近いファイルであればいきなりこちらでもいいかもしれません

https://www.iloveimg.com/ja/resize-image/resize-png

背景を削除する

人物やキャラクターのみ学習させたい場合は背景情報を削除しましょう

https://www.remove.bg/ja

背景を別の背景にする

自分は FireAlpaca を使いました
ざっくりとした流れは以下です

  1. 背景画像とする素材を準備する
  2. FireAlpaca を開き背景を削除した自分物の画像と背景の素材画像を開く
  3. 新規のファイルを512x512で作成しそれらに新規のレイヤーとして2つの画像を重ねる
  4. それぞれのレイヤーの位置を調整する
  5. 自分物画像などは少し傾けたりするといいかも
  6. 最後にラスタライズして png 画像をエクスポートして終了

最後に

自分なりの LoRA に学習させるための 512x512 サイズの画像を作成する方法を紹介しました

各パーツごとの学習用画像ファイルを作成する場合にはまず各パーツのみの画像を用意しあとは今回の流れに沿えば OK かなと思います

2024年5月28日火曜日

SuperAdapters を使って M2 mac mini 上で日本語モデルの Fine-tuning をしてみる

SuperAdapters を使って M2 mac mini 上で日本語モデルの Fine-tuning をしてみる

概要

SuperAdapters はどのモデルでもどのデータセットでもどのプラットフォームでも Fine-Tuning を実現することができるクロスプラットフォームツールです
今回は M2 mac mini 上で LLaMA の日本語モデルを Fine-tuning してみました

環境

  • macOS 14.4.1
  • SuperAdapters 30ef7d3
  • Python 3.11.8

準備

  • pyenv install 3.11.8

プロジェクト準備

M2 の GPU が使えるようにします

  • git clone https://github.com/cckuailong/SuperAdapters.git
  • cd SuperAdapters
  • pyenv local 3.11.8
  • brew install llvm libomp
  • pip install --pre torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/nightly/cpu
  • pip install -r requirements.txt

tokenizers でコンフリクトエラーが出る場合は requirements.txt を以下のように修正します

-tokenizers==0.15.0
+tokenizers==0.19.1

モデルのダウンロード

モデルはこちらを使います
LLaMA ベースの日本語特化モデルになります
fast 版には SuperAdapters が対応していないので普通の instruct 版を使います
モデルサイズは15GB ほどあります

  • brew install git-lfs
  • cd SuperAdapters/LLMs
  • git clone https://huggingface.co/elyza/ELYZA-japanese-Llama-2-7b-instruct

データセットのダウンロード

データセットはこちらを使います

  • cd SuperAdapters/data/train
  • rm example.json
  • git lfs install
  • git clone https://huggingface.co/datasets/bbz662bbz/databricks-dolly-15k-ja-ojousama

学習 Fine-Tuning

  • PYTORCH_MPS_HIGH_WATERMARK_RATIO=0.0 python finetune.py --model_type llama --data "data/train/databricks-dolly-15k-ja-ojousama" --model_path "LLMs/ELYZA-japanese-Llama-2-7b-instruct" --adapter "lora" --output_dir "output/llama"

W&B アカウントがあるかないか求められるのでない場合は 3 を入力します
学習が完了すると output/llama に作成されます

推論 Inference

  • PYTORCH_MPS_HIGH_WATERMARK_RATIO=0.0 python inference.py --model_type llama --instruction "こんにちわ" --model_path "LLMs/ELYZA-japanese-Llama-2-7b-instruct" --adapter_weights "output/llama" --max_new_tokens 32

これで Fine-Tuning したモデルの結果が表示されます

トラブルシューティング

PYTORCH_MPS_HIGH_WATERMARK_RATIO=0.0 に設定していてもメモリサイズが足りない場合強制終了してしまいます
こうなると物理的にメモリを増設するしかないようです

最後に

SuperAdapters を使って M2 mac mini で LLaMA モデルの Fine-Tuning を試してみました
GPU は使ってくれるようですメモリサイズが小さすぎると動作しないようです

参考サイト

2024年5月27日月曜日

M2 mac mini 上に text-generation-webui をインストール

M2 mac mini 上に text-generation-webui をインストール

概要

text-generation-webui は LLM を使ったチャットや追加学習ができる WebUI ツールです
今回は M2 mac mini 上にインストールしてチャットを試してみました

環境

  • macOS 14.4.1
  • text-generation-webui 2024-04-28
  • Python 3.10.10

インストール

  1. https://github.com/oobabooga/text-generation-webui/archive/refs/heads/main.zip をダウンロード
  2. unzip text-generation-webui-main.zip
  3. cd text-generation-webui-main
  4. ./start_macos.sh

起動確認

http://localhost:7860/ にアクセスします
デフォルトはチャットの画面です
まだモデルがないので何もできません

モデルのダウンロード

便利なダウンロードが付属しているのでそれを使います
今回は日本語でチャットしたいので日本語に対応しているモデルをダウンロードしました
モデルのサイズは 5GB ほどあります
llama.cpp が使える形式でないと非常に遅いので gguf に変換されたモデルをダウンロードします

  • ./installer_files/conda/bin/python download-model.py elyza/ELYZA-japanese-Llama-2-7b
  • ./installer_files/conda/bin/python download-model.py mmnga/ELYZA-japanese-Llama-2-7b-fast-instruct-gguf

models/mmnga_ELYZA-japanese-Llama-2-7b-fast-instruct-gguf にダウンロードされます

ELYZA-japanese-Llama-2-7b でも Transformers を使えば動作するのですが GPU がうまく動作しないため llama.cpp を使っています

モデルの設定

Model タブから指定します
リロードしモデルを選択したら Load をクリックして設定します

動作確認

モデルが設定できたら Chat タブに戻って動作を確認します
chat-instruct モードにしましょう (あとから気づきましたが普通の chat でも動作しました)
日本語でも会話ができれば OK です

最後に

M2 mac mini 上に text-generation-webui をインストールしてみました
好きなモデルをダウンロードしてチャットなど試すことができます

次回はせっかくなので LoRA を試してみたいと思います -> Apple Sillicon 上ではまだ動作しないようなので諦めました

参考サイト

2024年5月25日土曜日

M2 mac mini 上で mlx を使って LoRA Fine-Tuning をしてみる

M2 mac mini 上で mlx を使って LoRA Fine-Tuning をしてみる

概要

前回の Google Colab 上で動作させたコードを mlx 化して M2 mac mini 上で動作させてみました

環境

  • macOS 14.5
  • Python 3.10.12
  • mlx 0.13.1
  • mlx-example 69700d84

準備

  • pyenv install 3.10.12

プロジェクトセットアップ

  • git clone https://github.com/ml-explore/mlx-examples.git
  • cd mlx-examples/lora
  • pyenv local 3.10.12
  • pip install -r requirements.txt

モデルのコンバート

LLaMA ベースの日本語モデル elyza/ELYZA-japanese-Llama-2-7b-instruct を更に safetensors 化したモデルを使います

  • python convert.py --hf-path 4bit/ELYZA-japanese-Llama-2-7b-instruct -q --q-bits 4

コンバートしたモデルは mlx_model 配下に作成されます

  • ls -1 mlx_model
config.json
model.safetensors
model.safetensors.index.json
special_tokens_map.json
tokenizer.json
tokenizer_config.json

データセットのコンバート

データセットのフォーマットが少し独自なので変換する必要があります

ここから databricks-dolly-15k-ja-ojousama.json をダウンロードし ojousama ディレクトリ配下に保存します

こちらのスクリプトを拝借して test.json, valid.json, test.json を作成します

  • pip install pandas scikit-learn
  • vim data_convert.py
import json

import pandas as pd
from sklearn.model_selection import train_test_split

# 元のサンプルデータのファイルパス
input_json_file = "./ojousama/databricks-dolly-15k-ja-ojousama.json"

# JSONデータをPandas DataFrameに読み込む
df = pd.read_json(input_json_file)

# ターゲットをclosed_QAとopen_QAに絞る
df = df[(df.category == "closed_qa") | (df.category == "open_qa")].reset_index(
    drop=True
)

# テキスト長が短い学習データTOP1300をデータセットとして扱う
# 学習に時間がかかる場合もしくはメモリを使いすぎる場合は ascending=True にして短い順にするか 1300 の数を小さくすること
df["length"] = df.instruction.str.len() + df.output.str.len()
df = df.sort_values(by="length", ascending=False)
df = df.head(1300)

# データフレームをシャッフル
df = df.sample(frac=1).reset_index(drop=True)

# validとtest用のデータを100件ずつ取り出し、残りをtrainに分割
valid_df, remaining_df = train_test_split(df, test_size=len(df) - 100, random_state=42)
test_df, train_df = train_test_split(
    remaining_df, test_size=len(remaining_df) - 100, random_state=42
)


# ヘルパー関数:データフレームを新しい形式でJSON Linesファイルに変換
def df_to_jsonl(df, file_name):
    with open(file_name, "w", encoding="utf-8") as file:
        for _, row in df.iterrows():
            formatted_data = {
                "text": f"USER:{row['instruction']} ASSISTANT:{row['output']}"
            }
            file.write(json.dumps(formatted_data, ensure_ascii=False) + "\n")


# 各データセットを対応するJSON Linesファイルに変換
df_to_jsonl(train_df, "./ojousama/train.jsonl")
df_to_jsonl(valid_df, "./ojousama/valid.jsonl")
df_to_jsonl(test_df, "./ojousama/test.jsonl")
  • python data_convert.py

で各種 json ファイルができれば OK です

ls -1 ojousama
databricks-dolly-15k-ja-ojousama.json
test.jsonl
train.jsonl
valid.jsonl

学習させるデータ量について

完結に言うと

  • 文章をたくさん学習させたほうがいいがメモリが足らなくなる
  • 文章が短いと短い文章しか生成してくれなくなるがメモリは少なくて済む

という感じなのでデータセットを作成する際に以下のように文章の長さと文章数を調整すると良いです

# 質問+解答の長さを length というフィールドに登録
df["length"] = df.instruction.str.len() + df.output.str.len()
# 文章が長い順にソート
# df = df.sort_values(by="length", ascending=False)
# 質問+解答の長さが200文字以上400文字以下のみ抽出、この条件で734件で14GBほどメモリ消費
filterd_df = (df["length"] >= 200) & (df["length"] <= 400)
df = df.loc[filterd_df]
# あとはここを調整、1300以下ならそのままで OK
df = df.head(1300)

Fine-Tuning

  • python lora.py --model mlx_model --data ojousama --train --iters 600

iters で学習回数を指定できます
その他学習時のパラメータは python lora.py --help で確認できますが TrainingArguments で指定可能なパラメータすべてを指定できるわけではないようです

結果は以下の通りでだいたい5時間ほどかかりました (学習させるデータを短い版にすると1時間ほどで完了しました)
adapters.npz という numpy ベースのファイルができれば OK です

動作確認: 推論

  • python lora.py --model mlx_model --adapter-file adapters.npz --prompt "USER:日本の首都は? ASSISTANT:"

結果

Loading pretrained model
Total parameters 1055.199M
Trainable parameters 2.097M
Loading datasets
Generating
USER:日本の首都は? ASSISTANT:ワタクシ思いますの、 東京は、日本の首都ですわ 
ξ゚⊿゚)ξ
==========

使用したモデル

使用したデータセット

最後に

M2 mac mini 上で LLaMA ベースの日本語モデルを LoRA Fine-Tuning してみました
スクラッチではないので細かいところまで手は届きませんが性能的にはこれで十分かなと思います
また mlx に対応しておりフルに GPU を使って学習してくれるので Apple Sillicon 上でもそれなりのスピードが出せます
やはり M2 上では mlx が必須のようです

過去にいろいろな webui 系のツールを試してみましたがそれらも mlx に対応してくれると Apple Sillicon 上でも機械学習がやりやすくなるのかなと思いました

参考サイト

2024年5月24日金曜日

LLaMA-Factory を m2 mac mini 上で動作させる方法

LLaMA-Factory を m2 mac mini 上で動作させる方法

概要

LLaMA-Factory は簡単に Fine-Tuning を実現できるツールです
今回は M2 mac mini 上に構築してみました
CLI でも学習できますが今回は WebUI モードを試します

なお Python は 3.8系 を使います

環境

  • macOS 14.4.1
  • LLaMA-Factory 0.7.1
  • Python 3.8.18

準備

  • pyenv install 3.8.18

プロジェクトセットアップ

  • git clone --depth 1 https://github.com/hiyouga/LLaMA-Factory.git
  • cd LLaMA-Factory
  • pyenv local 3.8.18
  • pip install -e '.[torch,metrics]'

WebUI の起動

  • CUDA_VISIBLE_DEVICES=0 GRADIO_SHARE=0 llamafactory-cli webui

これで http://localhost:7860/ で起動します

ちょっと試す

とりあえずデフォルトで準備されているモデルやデータセットを使って Fine-Tuning してみます
最低限の Fine-Tuning に必要な設定は2つだけです

  • 事前学習済みモデルの指定 (huggyllama/llama-7b)
  • データセットの指定 (lima)

llama の事前モデルと llma のデータセットなのであまり効果がない Fine-Tuning になりそうですが今回はテストでとりあえず試したいので良しとします

あとは画面下部にある「Start」をクリックすれば学習が始まります

初回実行時にモデルのダウンロードが入ります
今回のモデル (model-00001-of-00002.safetensors/model-00002-of-00002.safetensors) は 15GB ほどあるのでディスクの容量には注意しましょう

ダウンロードに失敗した場合は結果のディレクトリを一度削除して再度実行すればモデルのダウンロードも再開します

ちなみに今回のモデルとデータセット+パラメータでだいたい 107 x 3 = 321 時間ほど学習に時間がかかりそうです

学習したモデルを試すには Refresh Adapters を押しモデルを指定します
そして Chat タブに移動しプロンプトにメッセージを入力することで Fine-Tuning したモデルを試すことができます

fp16 mixed precision requires a GPU (not ‘mps’) 対策

まず transformers を 4.38.1 にします

  • pip install 'transformers==4.38.1'

https://github.com/hiyouga/LLaMA-Factory/issues/2812

そして Train タブの Compute type を fp32 にします

https://github.com/hiyouga/LLaMA-Factory/issues/2329

更に MPS backend out of memory (MPS allocated: 18.09 GB, other allocations: 384.00 KB, max allowed: 18.13 GB) 対策として PYTORCH_MPS_HIGH_WATERMARK_RATIO を 0.0 にして webui を再起動します

https://github.com/AUTOMATIC1111/stable-diffusion-webui/issues/9133

  • PYTORCH_MPS_HIGH_WATERMARK_RATIO=0.0 CUDA_VISIBLE_DEVICES=0 GRADIO_SHARE=0 llamafactory-cli webui

ちなみにこの設定を行うとメモリを無限に使用するので 16GB しかない M2 mac mini だとスワップが発生しまくります (自分の環境だと約 20GB ほどスワップ領域を使っていました)

最後に

LLaMA-Factory を M2 mac mini 上で動作させてみました
起動まではかなり簡単に行えます
デフォルトだと学習にかなり時間がかかるのでその場合は Max samples = 1Epochs = 1 などの数値を下げて学習してください
ちなみに上記設定であれば 7 分ほどで学習が完了しました (テストには良いと思います

機会があればオリジナルのデータセットを使って Fine-Tuning してみたいと思います

参考サイト

2024年5月23日木曜日

日本語 LLaMA ベースのモデルを Google Colab 上で Fine-Turning してみた

日本語 LLaMA ベースのモデルを Google Colab 上で Fine-Turning してみた

概要

これまでいろいろと M2 mac mini 上で Fine-Tuning を試してきましたがメモリが足りなかったりスペックが低くて学習時間がとんでもなくかかったりと大変でした
なので今回は Google Colab を使ってスクラッチで日本語モデルの Fine-Tuning を試してみます

環境

  • Google Colab (T4 GPU)
    • Python 3

学習コード

コードブロックごとにコメントをつけているのでそれ単位で実行すると良いかなと思います

# 必要なライブラリのインストール
%%capture
%pip install accelerate peft bitsandbytes transformers trl

# 必要なモジュールとクラスのインポート
import os
import torch
from datasets import load_dataset
from transformers import (
    AutoModelForCausalLM,
    AutoTokenizer,
    BitsAndBytesConfig,
    TrainingArguments,
    pipeline,
    logging,
)
from peft import LoraConfig
from trl import SFTTrainer, DataCollatorForCompletionOnlyLM

# 今回使用する日本語言語モデルとデータセット名の定義
base_model = "elyza/ELYZA-japanese-Llama-2-7b-instruct"
dataset = "bbz662bbz/databricks-dolly-15k-ja-ojousama"
new_model = "elyza-2-7b-instruct-ojousama"

# データセットのロード
dataset = load_dataset(dataset, split="train")

# QLoRAを使ってFine-Tuningする、QLoRAにすることで低スペック環境でもFine-Tuningできるようにする
compute_dtype = getattr(torch, "float16")

quant_config = BitsAndBytesConfig(
    load_in_4bit=True,
    bnb_4bit_quant_type="nf4",
    bnb_4bit_compute_dtype=compute_dtype,
    bnb_4bit_use_double_quant=False,
)

# 日本語言語モデルのダウンロードと読み込み、quantization_config を指定して 4bit 量子化 (QLoRA) を設定
model = AutoModelForCausalLM.from_pretrained(
    base_model,
    quantization_config=quant_config,
    device_map={"": 0}
)
model.config.use_cache = False
model.config.pretraining_tp = 1

# モデルからトークナイザーの取得
tokenizer = AutoTokenizer.from_pretrained(base_model, trust_remote_code=True)
tokenizer.pad_token = tokenizer.eos_token
tokenizer.padding_side = "right"

# LoRA 用のパラメータ設定
peft_params = LoraConfig(
    lora_alpha=16,
    lora_dropout=0.1,
    r=64,
    bias="none",
    task_type="CAUSAL_LM",
)

# 訓練に必要なハイパーパラメータの設定
training_params = TrainingArguments(
    output_dir="./results",
    num_train_epochs=1,
    # Gradient Accumulation 有効化 (メモリ削減テクニック1)
    per_device_train_batch_size=4,
    gradient_accumulation_steps=16,
    # Gradient Checkpointing の有効化 (メモリ削減テクニック2)
    gradient_checkpointing=True,
    optim="paged_adamw_32bit",
    save_steps=25,
    logging_steps=25,
    learning_rate=2e-4,
    weight_decay=0.001,
    fp16=False,
    bf16=False,
    max_grad_norm=0.3,
    max_steps=-1,
    warmup_ratio=0.03,
    group_by_length=True,
    lr_scheduler_type="constant",
    report_to="tensorboard"
)

# 学習データのフォーマットを行う
# 学習データは json 形式で質問 (instruction)、回答 (output)、入力 (input) などが用意されている
# 今回は質問と回答を使って学習用のデータを準備する
def formatting_prompts_func(example):
    output_texts = []
    for i in range(len(example['instruction'])):
        text = f"### Question: {example['instruction'][i]}\n ### Answer: {example['output'][i]}"
        output_texts.append(text)
    return output_texts

# 学習時に回答部分がどこから始まるか教えてるための区切り文字の準備
response_template = " ### Answer:"
collator = DataCollatorForCompletionOnlyLM(response_template, tokenizer=tokenizer)

# 学習を開始するためのオブジェクト作成
# ここで GPU メモリが上がる
trainer = SFTTrainer(
    model=model,
    train_dataset=dataset,
    peft_config=peft_params,
    formatting_func=formatting_prompts_func,
    data_collator=collator,
    max_seq_length=None,
    tokenizer=tokenizer,
    args=training_params,
    packing=False,
)

# 学習開始
# ここでも GPU メモリが上がるが 10GB 以上は上がらないようにチューニングしているので学習が開始される
trainer.train()

今回のハイパーパラメータで学習はだいたいX時間ほどかかりました

推論コード

prompt = "プログラミングについてはどうお考えですの?"
pipe = pipeline(task="text-generation", model=model, tokenizer=tokenizer, max_length=200)
result = pipe(f"<s>[INST] {prompt} [/INST]")
print(result[0]['generated_text'])

データセット

ベースモデル

Tips: GPU メモリ削減テクニック

Tips: This instance will be ignored in loss calculation. Note, if this happens often, consider increasing the max_seq_length. 対策

SFTTrainer の max_seq_length のデフォルト値は 1024 です
学習させるデータ内に 1024 文字以上ある文章が含まれている場合は少し増やしてもいいかもしれません

Tips: trainer/utils.py:141: UserWarning: Could not find response key

なぜが学習データがうまく読み込めないようです
トークナイザーが原因の可能性もあるようですが response_template などを変更するとうまくいくかもです

参考: https://github.com/huggingface/trl/issues/588

最後に

Google Colab 上で 日本語で事前学習済みの LLaMA ベースのモデルを Fine-Tuning してみました
作成したモデルで推論までできるので低スペックなマシンしかない人でもこの方法ならわりと大規模な言語モデルでも Fine-Tuning できるかなと思います

ただ Google Colab の無料枠だと一日の使用時間が短いので学習前にリソースが終了する可能性があります

参考サイト

2024年5月22日水曜日

rq dashboard を docker compose で動かしてみる

rq dashboard を docker compose で動かしてみる

概要

過去に rq-dashboard を docker で動作させました
今回は docker compose で動作させます

環境

  • Ubuntu 22.04.4
  • docker 26.1.1

compose.yml

services:
  dashboard:
    image: eoranged/rq-dashboard
    environment:
      RQ_DASHBOARD_REDIS_URL: redis://172.17.0.1:6379
      RQ_DASHBOARD_USERNAME: user01
      RQ_DASHBOARD_PASSWORD: xxxxxxx
    ports:
      - 9181:9181

動作確認

  • docker compose up -d

で localhost:9181 で起動します
ベーシック認証ありで起動します

最後に

環境変数は RQ_DASHBOARD_ + 各種オプション名で指定可能です

2024年5月21日火曜日

GithubActions を使って docker hub に自動でイメージを push する方法

GithubActions を使って docker hub に自動でイメージを push する方法

概要

master push するたびに自動でイメージをビルドして push するようにします

環境

  • macOS 11.7.10
  • GithubActions v3
  • Dockerhub (20240516時点)

Github へのシークレット登録

自分のプロジェクト -> Settings -> Secrets and variables -> Actions -> Repository secrets -> New repository secret

  • DOCKERHUB_TOKEN
  • DOCKERHUB_USERNAME

を追加します

Dockerhub で Personal Access Token の取得

DOCKERHUB_TOKEN は以下で取得します

MyAccount -> Security -> Access Tokens -> New Access Token

.github/workflows/docker.yml の作成

  • vim .github/workflows/docker.yml
name: ci

on:
  push:
    branches:
      - "master"

jobs:
  docker:
    runs-on: ubuntu-latest
    steps:
      - name: Set up QEMU
        uses: docker/setup-qemu-action@v3
      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3
      - name: Login to Docker Hub
        uses: docker/login-action@v3
        with:
          username: ${{ secrets.DOCKERHUB_USERNAME }}
          password: ${{ secrets.DOCKERHUB_TOKEN }}
      - name: Build and push
        uses: docker/build-push-action@v5
        with:
          push: true
          tags: kakakikikeke/request-dumper:latest

動作確認

今回は master に push したい際に動作します

  • git push -u origin master

あとはプロジェクトの Acitons を見ると ci というワークフローが流れているのが確認できると思います

refusing to allow a Personal Access Token to create or update workflow 対策

自分のアカウント -> Settings -> Developer Settings -> Personal access tokens -> Tokens (classic)

で git push に使用している PAT を選択し workflow の権限を付与します

最後に

GithubActions を使って自動で docker hub にイメージを push する方法を紹介しました

これでいちいちローカルでイメージの作り直しをしなくて済みます

ちなみにシークレット情報は各プロジェクトごとに設定する必要があります

参考サイト

2024年5月20日月曜日

voice-generator-webui を M2 mac mini 上で動かす方法

voice-generator-webui を M2 mac mini 上で動かす方法

概要

voice-generator-webui を AppleSillicon 上で動かしてみました
最初にポイントですが Python のバージョンが 3.10.6 でないとダメそうです
自分は 3.10.11 で試しましたがライブラリのインストールでハマったので素直に 3.10.6 を使うのが良さそうです

環境

  • macOS 14.4.1 (M2Pro Mac mini)
  • Python 3.10.6

準備

  • pyenv install 3.10.6
  • brew install espeak

プロジェクトセットアップ

  • git clone https://github.com/log1stics/voice-generator-webui.git
  • cd voice-generator-webui
  • pyenv local 3.10.6
  • chmod +x setup.sh
  • ./setup.sh

起動

最後に

起動はできそうですが最新版への追従が微妙そうなので tts-generation-webui を使うほうが良さそうです

2024年5月19日日曜日

Stable diffusion WebUI で ERROR: python3-venv is not installed, aborting...

Stable diffusion WebUI で ERROR: python3-venv is not installed, aborting...

概要

最新版を clone したらタイトルのエラーが発生したので対応しました

環境

  • macOS 14.4.1
  • sd-webui 1.6.0
  • Python 3.10.11

対応方法

デフォルトだと python3.10 というコマンドを探すのでこれがないとエラーになります
Homebrew でインストールしてもいいのですがメインの Python はすでに 3.12 になっているので 3.10 にすると困ります
brew link で切り替えるのも手ですが毎回切り替えるのも面倒なので pyenv を使います

  • cd stable-diffusion-webui
  • pyenv local 3.10.11

これで python3.10 コマンドが stable-diffusion-webui 配下で使えるようになります

動作確認

あとは ./webui.sh を実行すれば OK です

最後に

執筆時点の sd-webui では Python 3.10 が推奨っぽいです
最新版にした場合はサポートしている Python のバージョンを確認して pyenv で切り替えると良いかなと思います

参考サイト

2024年5月18日土曜日

Bark 用の学習済み音声モデル(npz)を使ってTTSさせる方法

Bark 用の学習済み音声モデル(npz)を使ってTTSさせる方法

概要

Bark は transformers に対応しているので学習した音声モデルを使うことができます
今回は transformers を使って Python スクリプトで tts してみます

環境

  • macOS 14.4.1 (M2Pro Mac mini)
  • Python 3.12.2
  • bark 0.1.5
  • scipy 1.13.0
  • transformers 4.40.2

サンプルコード

from scipy.io import wavfile
from transformers import AutoProcessor, BarkModel

# モデルのダウンロード
processor = AutoProcessor.from_pretrained("suno/bark-small")
model = BarkModel.from_pretrained("suno/bark-small")

# 学習済み音声モデルの指定
# voice_preset = "v2/ja_speaker_6"
voice_preset = "/Users/user01/one-click-installers-tts-6.0/tts-generation-webui/voices/Alice.npz"

# TTS設定
inputs = processor("こんにちわ、今日はいい天気ですね", voice_preset=voice_preset)

# モデルから音声の作成
audio_array = model.generate(**inputs, semantic_max_new_tokens=100)
audio_array = audio_array.cpu().numpy().squeeze()

# 音声の保存
sample_rate = model.generation_config.sample_rate
wavfile.write("/Users/user01/Downloads/audio.wav", sample_rate, audio_array)

最後に

tts-generator-webui でも同じように学習済み音声モデルを使って TTS できますがどちらがいいのが気になりました
transformers を使い慣れている人は直接 Python を触れる方が良いのかもしれません

参考サイト

2024年5月17日金曜日

Bark で AI 音声作成超入門

Bark で AI 音声作成超入門

概要

Bark は事前に学習された音声モデルを使って与えた文章を読み上げることができる transformers で扱えるツールです
今回はデフォルトの音声モデルを使ってとりあえず文章を読ませてみました
最終的には音声データが作成できます

環境

  • macOS 14.4.1 (M2Pro Mac mini)
  • Python 3.12.2
  • bark 0.1.5

インストール

  • pipenv install bark

サンプルコード

import os

from bark import SAMPLE_RATE, generate_audio, preload_models
from IPython.display import Audio
from scipy.io.wavfile import write as write_wav

# AppleSillicon上で動作させるための設定
os.environ["SUNO_ENABLE_MPS"] = "True"

# 事前学習済みの音声モデルのダウンロード(全部10GBほどあるので注意
preload_models()

# 音声モデルに喋らせる文章の準備
text_prompt = """
     Hello, my name is Suno. And, uh — and I like pizza. [laughs] 
     But I also have other interests such as playing tic tac toe.
"""
audio_array = generate_audio(text_prompt)

# 音声モデルから実際に音声を作成する
write_wav("bark_generation.wav", SAMPLE_RATE, audio_array)

# 音声の再生
Audio(audio_array, rate=SAMPLE_RATE)

モデルは ~/.cache/suno/bark_v0/fine_2.pt などにダウンロードされます

動作確認

サンプルコードを実行すると自動で音声が再生されます
サンプルコードは英語ですが日本語でも普通に再生されました

最後に

bark で TTS をとりあえず試してみました
これを応用して自分の声の音声モデルを作成すれば自分のクローンが作れます
また歌を歌ってもらうこともできるようです

初回にダウンロードするモデルのデータがかなり大きいのでディスクの容量に注意してください
M2 Mac の場合 GPU 対応していないので少し時間がかかります
低スペックのマシンだと音声を生成するのにかなり時間がかかるかもしれません
喋らせる文章が長ければ長いほど実行にも時間がかかります

成功した場合の音声ファイルは 1MB 弱ですが失敗すると100MBほどになりビープ音みたいな感じになることもあったので失敗する場合は再度実行してみてください

参考サイト

2024年5月16日木曜日

AudioCraft を M2 mac mini 上で動かしてみた

AudioCraft を M2 mac mini 上で動かしてみた

概要

AudioCraft は音を生成することができる MusicGen や AudioGen を簡単に扱うことができるツールです
今回は M2 mac 上にインストールして AudioGen を使ってみました

環境

  • macOS 14.4.1
  • Python 3.9.17
  • AudioCraft 1.3.0 (795f8dc)

Python3.9 インストール

  • pyenv install 3.9.17

プロジェクトクローン

  • git clone https://github.com/facebookresearch/audiocraft
  • cd audiocraft
  • pyenv local 3.9.17

プロジェクトセットアップ

pytorch はバージョン 2.1.0 である必要があります

  • pip install "torch==2.1.0"
  • pip install -r requirements.txt

MusicGen 用のデモアプリの起動

MusicGen にはデモアプリが付属しているので今回はそれを使います

  • python -m demos.musicgen_app --share

http://127.0.0.1:7860 で起動します

動作確認

Input Text に作成したい音楽のテキストを入力してみます
今回は「happy rock」と入力しました
あとは「Submit」をクリックするだけです

初回は各種モデルをダウンロードするので時間がかかります
モデルのサイズは全部で 5GB ほどあるのでディスク容量に注意しましょう

音楽が完成すると右側でダウンロードや直接再生ができます
デフォルトでは10秒間分の音楽のみ生成してくれます

最後に

AudioCraft の MusicGen を試してみました
sd-webui の音楽版という感じでテキストから音楽を作成することができます
今回は10秒でしたがもっと長い音楽も生成することができます

AudioGen 用のデモもあるのですが AudioGen は WebUI ではないようです

参考サイト

2024年5月15日水曜日

tts-generator-webui で bark 用の音声モデルを使ってテキストの読み上げをやってみる

tts-generator-webui で bark 用の音声モデルを使ってテキストの読み上げをやってみる

概要

前回 Bark 用のモデルを生成してみました
今回はそれを使ってテキストの読み上げを行います

環境

  • macOS 14.4.1 (M2Pro Mac mini)
  • tts-generator-webui 6.0

方法

tts-generator-webui を起動します
最初に「Generation (Bark)」タブに移動します

次に「Audio Voice」で学習させた Bark 用の音声モデルファイルを指定します (npz)
次に「Prompt」に読み上げさせる文章を指定します
あとは画面下部にある「Generate」をクリックするだけです

初回生成時は Bark 関連のモデルがダウンロードされるので時間がかかります
5GB ほどあるのでディスクの容量に注意しましょう

ちょっとポイント

読み上げる文章が短い場合には Max length パラメータを調整しましょう
最大で18秒かけて文章を読み上げてくれますが文字が少ないのに length が長いとうまく読み上げてくれないことがあるので文字数に応じて length を調整するようにしてください

自然に読み上げてみてそれにかかった秒数を指定するのが良いかなと思います

動作確認

Generate 後に音声が完了するとそのまま再生することができるので再生して確認しましょう

最後に

Bark 用の音声モデルを使ってテキストの読み上げを行ってみました
最大で18秒分しか生成できないので長文を読ませる場合には何度か生成する必要があります
日本語にも対応していました (音声モデルも日本語の音源から生成しています)

Bark で使用したモデルファイル (npz) は RVC で生成したモデルファイル (pth) では使えないので注意しましょう

どちらも音声モデルから新しい音声を生成する手法ですが

  • Bark はテキストから音声を生成するのに対して
  • RVC は音声から声の部分だけを挿げ替えて音声を生成する

ので使用するモデルも変わってきます

また StableDiffusion のように生成ごとに結果が変わるのでうまく読み上げてくれるまでガチャする必要があります

2024年5月14日火曜日

tts-generator-webui で bark 用の音声モデルを作成する

tts-generator-webui で bark 用の音声モデルを作成する

概要

Bark 用の音声モデルを生成するのに有名なサンプルで https://github.com/serp-ai/bark-with-voice-clone がありますがこれだといろいろとハマるところがあります
tts-generator-webui には bark の Generate と Voice Clone が WebUI として実装されているので簡単に生成することができます
今回は Bark 用の音声モデル npz ファイルを生成する方法を紹介します

環境

  • macOS 14.4.1 (M2Pro Mac mini)
  • tts-generator-webui 6.0

準備

事前に1分程度の音声ファイルを準備しましょう
ファイルは BGM などのないシンプルな音声ファイルが望ましいです

モデル生成

tts-generator-webui を起動します
次に「Bark Voice Clone」タブを選択します
「Input Audio」に準備した音声ファイルを指定します

M2 mac の場合 GPU は使えないので「Use GPU」のチェックは外しましょう

そして「Generate Voice」をクリックします
しばらくすると npz ファイルが作成されます

またモデルの生成が完了したら「Use as histroy」をクリックしておきましょう
そのまま Generate の画面に移動しますが念の為モデルが保存されているか確認するためです

Tips

音源ファイルが長すぎるとうまくいかないことがあるので可能な限り短い音源を準備しましょう
自分は 2 分程度であればうまくモデルを生成することができました

最後に

tts-generator-webui で Bark 用の音声モデルを生成してみました
次回はこの音声モデルを使ってテキストを読み上げてみたいと思います

2024年5月13日月曜日

tts-generator-webui を M2 mac mini 上で動かす方法

tts-generator-webui を M2 mac mini 上で動かす方法

概要

tts-generator-webui を M2 mac mini 上で動かしてみました
voice-generator-webui よりもこちらのほうが良いかなと思います

環境

  • macOS 14.4.1 (M2Pro Mac mini)
  • tts-generator-webui 6.0

ダウンロード

https://github.com/rsxdalv/one-click-installers-tts/archive/refs/tags/v6.0.zip これをダウンロードします

ダウンロードしたら解答しましょう

  • unzip one-click-installers-tts-6.0.zip

インストール/起動

必要なものをすべてインストールしてくれるスクリプトがあるのでそれを実行します

  • cd one-click-installers-tts-6.0
  • chmod +x start_macos.sh
  • ./start_macos.sh

途中 GPU を選択する部分があるので Apple M Series を選択しましょう

A) NVIDIA
B) AMD
C) Apple M Series
D) None (I want to run in CPU mode)

Input> C

conda や Python などを自動で installer_files 配下にダウンロード、インストールしてくれます
Python のバージョンは 3.10.14 でした (installer_files/env/bin/python

必要なライブラリがインストールされ localhost:3000 で起動すれば OK です

動作確認

以下のような感じで起動すれば OK です
各音声モデルジェネレータごとにタブで分かれているのでわかりやすいです

React 版は localhost:7860/ で動作しているようです

最後に

tts-generator-webui を M2 mac 上で動作させてみました
次回はこれを使って音声モデルから適当な文章を喋らせてみようと思います

参考サイト

2024年5月12日日曜日

RVC WebUI を使って音楽の BGM と声を分離する方法

RVC WebUI を使って音楽の BGM と声を分離する方法

概要

前回 RVC WebUI で音声を他の音声で推論する処理をやってみました
今回は音源に歌を準備し歌の BGM とボーカルパートを分割する方法を紹介します

環境

  • macOS 14.4.1 (M2Pro Mac mini)
  • Python 3.9.18
  • RVC WebUI (updated1006v2)

準備

BGM と声を分割したい音源を準備しましょう
適当な歌で OK です
できれば一人で歌っている歌がいいかなと思います

方法

RVC WebUI を立ち上げ「Vocals/Accompaniment Separation & Reverberation Removal」を選択します

まず「Enter the path of the audio folder to be processed」に音源を配置したディレクトリを指定します
ファイルへのフルパスではなくディレクトリなので注意してください
このディレクトリ配下にファイルはすべて分割されます

次に「Model」を選択します
いろいろありますが今回は「HP3_all_vocals」を選択しました
分割の精度が悪い場合は HP2 など他のモデルで試してみてください

最後に「Convert」で分割を開始します

Success になれば完了です
分割したファイルは Retrieval-based-Voice-Conversion-WebUI-updated1006v2/opt 配下に flac 形式で保存されます
instrument_ で始まるファイルが 声のみで vocal_ から始まるファイルが BGM のみになります

最後に

RVC WebUI で音楽の BGM と声を分割してみました
おそろしく簡単にできすぎてびっくりします

参考サイト

2024年5月11日土曜日

RVC WebUI を使って音声の変換をする

RVC WebUI を使って音声の変換をする

概要

前回 安定バージョンの RVC WebUI を動かし音声データからモデルを生成するところまでやりました
今回は作成した音声モデルを使って音声の変換をしてみたいと思います

環境

  • macOS 14.4.1 (M2Pro Mac mini)
  • Python 3.9.18
  • RVC WebUI (updated1006v2)

準備

音声を変換する音源を準備しましょう
何でも OK ですができれば単純な文章読み上げがいいかもしれません
自分は適当な歌を mp3 ファイルとして用意しました

声の変換

RVC WebUI を起動してアクセスします

「Model Inference」タブを選択します
そして「Inferencing voice」に前回作成した音声モデルファイル (pth) を設定します
更に音声を変換したいファイルを「Enter the path of the audio file to be processed (default is the correct format example)」にフルパスで指定します

動作確認

成功すると以下のようなログが流れて RVC WebUI 上で音声を再生できるようになります
ダウンロードも可能で audio.wav というファイル名で保存されます

2024-05-10 09:06:14 | INFO | infer.modules.vc.pipeline | Loading rmvpe model,assets/rmvpe/rmvpe.pt
2024-05-10 09:06:52 | INFO | httpx | HTTP Request: POST http://localhost:7865/api/predict "HTTP/1.1 200 OK"
2024-05-10 09:06:52 | INFO | httpx | HTTP Request: POST http://localhost:7865/reset "HTTP/1.1 200 OK"

聞いてみると学習させた音声モデルで変換されていることが確認できると思います

トラブルシューティング

ValueError: mode must be 'r', 'w', or None, got: rb 

音声を変換するファイルを指定した際にエラーになりました
av ライブラリのバージョンを下げるとうまく動作するようです

  • . ./.venv/bin/activate
  • pip install --force-reinstall -v "av==11.0.0"
  • deactivate
  • ./run.sh

参考

最後に

RVC WebUI で音声変換できるところまでやってみました
基本の流れは今回紹介した方法なのであとはモデルを生成するときのチューニングや学習させる音声データのクリーニング、分割をしてモデルの精度をあげましょう
できれば学習させる際の音声データは歌などではなく会話が良いかなと思います
そして変換/推論する際にもパラメータがいくつかあるのでこれもチューニングしましょう
推論する際は歌などでも全然 OK ですができれば推論もアカペラなど BGM がない音源を準備できると良いかなと思います

参考サイト

https://toranoana-lab.hatenablog.com/entry/2023/12/22/120000

2024年5月10日金曜日

RVC を使って自分の音声を使ってモデルを生成する方法 (リベンジ編)

RVC を使って自分の音声を使ってモデルを生成する方法 (リベンジ編)

概要

前回 最新のコミットから起動してみましたが今回はリリースの安定版を動かしてみました

環境

  • macOS 14.4.1 (M2Pro Mac mini)
  • Python 3.9.18
  • RVC WebUI (updated1006v2)

事前準備

  • brew install aria2 ffmpeg

プロジェクトのダウンロード

https://github.com/RVC-Project/Retrieval-based-Voice-Conversion-WebUI/releases/tag/updated1006v2 から Retrieval-based-Voice-Conversion-WebUI-updated1006v2.tar.gz をダウンロードします

プロジェクトのセットアップ

  • tar zvxf Retrieval-based-Voice-Conversion-WebUI-updated1006v2.tar.gz
  • cd Retrieval-based-Voice-Conversion-WebUI-updated1006v2
  • pyenv local 3.9.18
  • python -m venv .venv
  • . ./.venv/bin/activate
  • pip install -r requirements.txt
  • deactivate

RVC WebUI 起動

  • ./run.sh

初回はモデルのダウンロードがあります
起動すると http://localhost:7865/ で起動します

音声の学習

前回同様です
ディレクトリがないエラーが出た場合は手動で作成します

動作確認

前回はモデル生成時にセグメンテーションエラーになり RVC WebUI が落ちる挙動があったのですがそれがなく正常に終了します

モデルは ./assets/weights/mi-test.pth に作成されます

最後に

最新のコミットではなくリリースにある安定版を使うほうが今のところは良さそうです
次回は作成できた pth モデルを使って別の音声情報と音声を交換してみたいと思います

参考サイト

2024年5月9日木曜日

RVC を使って自分の音声を使ってモデルを生成する方法

RVC を使って自分の音声を使ってモデルを生成する方法

概要

Retrieval-based-Voice-Conversion-WebUI というツールを見つけたので使ってみました
自分の音声から音声モデルを使って喋らせることができるようです

環境

  • macOS 14.4.1 (M2Pro Mac mini)
  • Python 3.8
  • RVC WebUI (fb16ba3)

起動

自動で Python3.8 がインストールされます
試しに Python 3.10 以上で試したのですがライブラリのインストールでエラーになったので3.8を使います http://localhost:7865/ で起動します

モデルのダウンロード

なぜか hubert_base.pt やらいろいろ足りていないのでモデルをダウンロードします

https://github.com/RVC-Project/RVC-Models-Downloader/releases から rvcmd_darwin_arm64.tar.gz をダウンロードします
展開し Retrieval-based-Voice-Conversion-WebUI のルートに配置します

  • tar zvxf rvcmd_darwin_arm64.tar.gz
  • mv rvcmd Retrieval-based-Voice-Conversion-WebUI
  • cd Retrieval-based-Voice-Conversion-WebUI
  • ./rvcmd assets/all

警告が出る場合は一度 Finder からクリックで起動して Open を選択することでターミナルからも実行できるようになります
実行すると必要なモデルを必要なパスに自動でダウンロードしてくれます

<

assets/hubert/hubert_base.pt がない場合は https://huggingface.co/lj1995/VoiceConversionWebUI/blob/main/hubert_base.pt こちらからダウンロードして配置してください

フォルダの作成

なぜか足りなかったので作成します

  • cd Retrieval-based-Voice-Conversion-WebUI
  • mkdir logs/mi-test/2a_f
  • mkdir logs/mi-test/2b-f0nsf

音声の準備

何でも OK です

音声の学習

パラメータはいろいろとチューニングできますが今回はデフォルトのままでいきます
まずは Train タブを選択します

UI 上にステップが記載されているのでそのステップ通りに進めます
ステップ1では名前とパラメータを設定します (基本はそのままで OK)
準備した音声ファイルを「Enter the path of the training folder」に入力し「Process data」を実行します

ステップ2の部分はそのままで OK です
あとはステップ3の「One-click training」を実行すれば OK です

これでモデルが生成できます

Segmentation fault 対策

  • cd Retrieval-based-Voice-Conversion-WebUI
  • . ./.venv/bin/active
  • pip install faiss-cpu==1.7.3

最後に

とりあえずモデルは生成できたので次回はこのモデルを使って話をさせてみます

参考サイト