見出し画像

Paperspace用の自作Dockerイメージの特徴と注意点@pytorch2.4.1+cuda12.4-v2について

個人的に使いやすいように前回作成したdockerイメージを調整してv2を作成しました。
作成した目的の影響かforgeではうまく作動しない部分があります。v1.0だと問題なく動きます。
ComfyUIでは、一部モジュールが足りないようですが問題なく動きます。

以下、コンテナにコピペする用です。

shibashiba2/paperspace-gradient-base-pytorch241:v2.0

一応、使いたい方もおられるかと思い、注意点とこのコンテナの特徴について記事にしています。

注目ポイントは3つ

①依存環境は現時点(2024/10)のものに対応
⇒ComfyUIのインストール前にする環境構築コマンドを省くことができます。※Forgeだとバージョンが合わない部分あり。

②huggingfaceからのdiffusers形式のsdxlダウンロード用のスクリプトが事前に入っている

③GGUF化の諸々が事前に入っている

<経緯みたいなもの>

②は作成したパイソンスクリプトをアップロードして参照していましたが、Dockerイメージに組み込めることが分かり、その運用で問題なく動作するようにスクリプトなどを修正しました。

③はさらに複雑な感じで、Dockerイメージに組み込む際に何回か失敗をしていましたが、現在は問題なく動いています。
関連するモジュールのインストールと、パッチをした「llama.cpp」を組み込み、Dockerイメージを作成する際に量子化のビルドを行っています。

これらのことで、②③はセルコマンドを実行するだけに簡素化することができました。

<新版Forgeのインストールコマンド>
※ここでGGUF化を試したのですが、GGUFモデルがうまく作動せず。。。機能紹介もかねて参考まで。

①Forgeのインストールコマンド

%cd /tmp

!git clone https://github.com/lllyasviel/stable-diffusion-webui-forge.git

①-2:diffusersのダウングレード

!pip install diffusers==0.29.2

②reForgeの起動コマンド

# /tmp/stable-diffusion-webuiディレクトリに移動してlaunch.pyを実行
!cd /tmp/stable-diffusion-webui-forge && python3 launch.py --enable-insecure-extension-access --share --gradio-queue --disable-xformers --pin-shared-memory --cuda-malloc

③モデルダウンロード:HuggingfaceのDiffusers形式のSDXL

# Jupyter Notebook

# モデルのURLとローカルパスのリスト
models = [
    {
        "base_url": "https://huggingface.co/John6666/uwazumi-mix-v11-sdxl/resolve/main",
        "base_path": "/tmp/stable-diffusion-webui-forge/models/Stable-diffusion/uwazumi-mix-v11-sdxl"
    },
    {
        "base_url": "https://huggingface.co/John6666/toon-e-pony-v1-sdxl/resolve/main",
        "base_path": "/tmp/stable-diffusion-webui-forge/models/Stable-diffusion/toon-e-pony-v1-sdxl"
    },
    {
        "base_url": "https://huggingface.co/John6666/real-mix-pony-rev04fix-sdxl/resolve/main",
        "base_path": "/tmp/stable-diffusion-webui-forge/models/Stable-diffusion/real-mix-pony-rev04fix-sdxl"
    }
]

# 各モデルについてスクリプトを実行
for model in models:
    base_url = model["base_url"]
    base_path = model["base_path"]
    print(f"Downloading model from {base_url} to {base_path}")
    !python3 /usr/src/app/modeldownload_from_hugginface.py {base_url} {base_path}

④コントロールネットのダウンロード

# コントロールネットip-adapter
!cd /tmp/stable-diffusion-webui-forge/models/ControlNet && \
wget -nc https://huggingface.co/lllyasviel/sd_control_collection/resolve/main/ip-adapter_xl.pth?download=true -O ip-adapter_xl.pth

# コントロールネットmistoline
!cd /tmp/stable-diffusion-webui-forge/models/ControlNet && \
wget -nc https://huggingface.co/TheMistoAI/MistoLine/resolve/main/mistoLine_fp16.safetensors?download=true -O mistoLine_fp16.safetensors

# コントロールネットDEPTH
!cd /tmp/stable-diffusion-webui-forge/models/ControlNet && \
wget -nc https://huggingface.co/lllyasviel/sd_control_collection/resolve/main/diffusers_xl_depth_full.safetensors?download=true -O diffusers_xl_depth_full.safetensors

理由は不明ですが、deforumは上手く動きませんでした。。。。

GGUF化について

Forgeで使えませんでしたので、参考まで。
手順をまとめることもできますが、念のためにステップごとにしています。
FLUXモデルをGGUF化してみました。

①モデルのダウンロード

!cd /tmp/stable-diffusion-webui-forge/models/Stable-diffusion && \
curl --progress-bar -L -o flux1-schnell-fp8.safetensors https://huggingface.co/Comfy-Org/flux1-schnell/resolve/main/flux1-schnell-fp8.safetensors?download=true

②モデルの名前とか配置場所を指定するコマンド

import os

MODEL_DIR = "/tmp/stable-diffusion-webui-forge/models/Stable-diffusion"
MODEL_NAME = "flux1-schnell-fp8.safetensors"  # ここにモデル名を入力
FINAL_DIR = "/tmp/stable-diffusion-webui-forge/models/Stable-diffusion"  # 移動先のディレクトリ
TEMP_DIR = os.path.join(MODEL_DIR, "temp_model")

# モデルディレクトリとファイルの存在確認
if not os.path.exists(MODEL_DIR):
    raise FileNotFoundError(f"モデルディレクトリが見つかりません: {MODEL_DIR}")
if not os.path.exists(os.path.join(MODEL_DIR, MODEL_NAME)):
    raise FileNotFoundError(f"モデルファイルが見つかりません: {MODEL_NAME}")

print("モデルディレクトリとファイルの確認が完了しました。")

③一時フォルダを作成するコマンド

import os

# 一時ディレクトリの作成
TEMP_DIR = os.path.join(MODEL_DIR, "temp_model")
try:
    os.makedirs(TEMP_DIR, exist_ok=True)
    print(f"一時ディレクトリを作成しました: {TEMP_DIR}")
except Exception as e:
    raise RuntimeError(f"一時ディレクトリの作成に失敗しました: {e}")

④量子化コマンド

import subprocess

CONVERT_SCRIPT = "/usr/src/app/safetensors_convert_GGUF.py"  
QUANT_METHOD = "Q4_K_M"  # You can change this to the desired quantization method.

# FP16モデルへの変換と量子化処理
try:
    result = subprocess.run(
        ["python3", CONVERT_SCRIPT, "--src", MODEL_NAME, "--model_dir", MODEL_DIR, "--temp_dir", TEMP_DIR, "--quant_method", QUANT_METHOD],
        capture_output=True,
        text=True
    )
    if result.returncode != 0:
        raise RuntimeError(f"変換スクリプトの実行に失敗しました: {result.stderr}")
    print(f"変換スクリプトの実行が完了しました: {result.stdout}")
except Exception as e:
    raise RuntimeError(f"変換スクリプトの実行に失敗しました: {e}")

これで、モデルが配置されていたフォルダ内に量子化されたものが作成されました。

今回のポイントとしては、量子化をセルコマンドで指定することが可能になりましたので、変更することが可能です。

Forgeで上手くいかないのは依存環境が合わない事が関係していると思われます。

※ComfyUIだと上手く動作しました。

今回学んだ事としては、コンテナにスクリプトを配置して呼び出す事で色々と手間が省ける可能性がありそうだと感じた事です。

llama.cppについては、最初はビルドされたフォルダをコピーしたのですが、それは上手くいかなかったので、パッチを当てたものをコピーして、dockerイメージを作成するときにビルドする方法にしました。

少し使用していて足りないモジュールとかもあったので、そのうち更新すると思います。


いいなと思ったら応援しよう!