【AUTOMATIC1111 on Paperspace Gradient】huggingface_hubを使いControlNetの学習済みモデルをtmpにダウンロードして,モデルのシンボリックリンクを配置する

はじめに

【AUTOMATIC1111 on Paperspace Gradient】ControlNetをインストールして実行するで,学習済みモデルをPersistent Storageにダウンロードしてしまったため,ストレージを圧迫してしまった.

一時領域であるtmpに,huggingface_hubを利用してHuggingFaceにあるControlNetの学習済みモデルをダウンロードした後,ControlNetが参照するフォルダにその学習済みモデルのシンボリックリンクを配置することでストレージの圧迫を防ぐ.

やり方

学習済みモデルを入れる親フォルダを定義

どこでも良いが,とりあえずpaperspace版AUTOMATIC1111でtmpディレクトリを使う場合にモデルを置いているディレクトリと同じところにしておく.

model_storage_dir = '/tmp/stable-diffusion-models'

フォルダ内に学習済みモデルのダウンロード用フォルダを作る

どこでも良いけど,とりあえず「/tmp/stable-diffusion-models/extension」というフォルダを作る.

!mkdir -p "{model_storage_dir}/extension"

HaggingFace-Hubのパッケージをインストールする.

HuggingFace-Hubを使って学習済みモデルをダウンロードするので,パッケージをインストール.

# 参考サイト:https://self-development.info/%E3%80%90%E4%BE%BF%E5%88%A9%E3%80%91huggingface_hub%E3%81%AB%E3%82%88%E3%82%8B%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89/

!python -m pip install --upgrade pip setuptools
!pip install huggingface-hub

huggingface_hubを使って学習済みモデルをダウンロード

hf_hub_downloadの引数であるrepo_idにはHaggingFaceのリポジトリ名を入れ,filenameにはダウンロードしたいモデルを指定する.

from huggingface_hub import hf_hub_download
 
hf_hub_download(repo_id="webui/ControlNet-modules-safetensors", filename="control_openpose-fp16.safetensors", revision="main")

ダウンロードされる場所は以下.

ダウンロードしたファイルは,赤丸に書いてあるディレクトリに保存されている.

先ほど用意した学習済みデータダウンロード用のディレクトリにダウンロードしたファイルを移動する.

ダウンロードした学習済みモデルを,先ほど作成したディレクトリである「{model_storage_dir}/extension」に移動する.

!mv /root/.cache/huggingface/hub/models--webui--ControlNet-modules-safetensors/snapshots/8612fbdc2c91ff14179027d2110b3cdc640aad8f/control_openpose-fp16.safetensors {model_storage_dir}/extension

学習済みモデルのシンボリックリンクを作成する

ダウンロードした学習済みモデルのシンボリックリンクを,ControlNetのモデルを設置する必要がある「/storage/stable-diffusion/stable-diffusion-webui/extensions/sd-webui-controlnet/models」ディレクトリに作成する.

import os
from glob import glob
from pathlib import Path
import sys

#stable-diffusion webuiをインストールした場所
repo_storage_dir = '/storage/stable-diffusion'         

model_storage_dir = Path(model_storage_dir)#ControlNetの学習済みモデルをダウンロードした場所.この記事では,model_storage_dirは'/tmp/stable-diffusion-models'である.
repo_storage_dir = Path(repo_storage_dir)

#シンボリックリンクを置きたい場所を指定
webui_ctrl_model_path = Path(repo_storage_dir, 'stable-diffusion-webui/extensions/sd-webui-controlnet/models')

#シンボリックリンクを作成するための関数
def create_symlink(source, dest):
    if os.path.isdir(dest):
        dest = Path(dest, os.path.basename(source))
    if not dest.exists():
        os.symlink(source, dest)
    print(source, '->', Path(dest).absolute())

#「.ckpt」,「 .safetensor」,「.safetensors」,「.st」があるかを探して,上記の関数に渡す関数
def link_ckpts(source_path):
    # Link .ckpt and .safetensor/.st files (recursive)
    print('\nLinking .ckpt and .safetensor/.safetensors/.st files in', source_path)
    source_path = Path(source_path)
    for file in [p for p in source_path.rglob('*') if p.suffix in ['.ckpt', '.safetensor', '.safetensors', '.st']]:
        if Path(file).parent.parts[-1] not in ['hypernetworks', 'vae'] :
            if not (webui_ctrl_model_path / file.name):
                print('New model:', file.name)
            create_symlink(file, webui_ctrl_model_path)

#ダウンロードしたControlNetの学習済みモデルのシンボリックリンクを作成する.
link_ckpts(model_storage_dir / 'extension')

正常にリンクされると以下のように表示される(以下の画像はcontrol_seg-fp16をリンクした際のもの).

フォルダを見てみると学習済みモデルがあることが分かる(以下は2つ学習モデルのシンボリックリンクを配置してみた画像).

まとめ

tmp領域にダウンロードした学習済みモデルのシンボリックリンクを,ControlNetのモデル置き場に配置することで,容量の削減ができそう.

参考サイト

【便利】huggingface_hubによるファイルのダウンロード https://self-development.info/%E3%80%90%E4%BE%BF%E5%88%A9%E3%80%91huggingface_hub%E3%81%AB%E3%82%88%E3%82%8B%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89/

コメント

タイトルとURLをコピーしました