stable diffusionのモデルのサイズが極めて大きいので、USBや他のPCにモデルを配置して、通常の場所を参照しないようにします。これをすることで、複数のパソコンでモデルを使いまわすことができるようになります。もしくは、stable diffusionの環境を1台のパソコンに複数インストールしている時にもモデルを共有することができます。同じモデルが重複していると、ディスクの無駄遣いになるのでお勧めです。
データの保存場所を変更できないソフトウェアの制約を回避するために、仮想フォルダやショートカットのような技術を利用することは考えられます。以下の方法が考えられます。
- シンボリックリンク (Symbolic Link):
- シンボリックリンクは、ファイルやディレクトリを別の場所にあるかのように見せかけることができます。これにより、ソフトウェアがデータを特定の場所に保存すると思っていても、実際には別の場所にデータが保存されることになります。
- マウントポイント (Mount Point):
- ファイルシステムの特定のポイントを、別のディスクやディレクトリにマウントすることで、データの保存場所を変更することができます。
- 仮想ディスク (Virtual Disk):
- 仮想ディスクを作成し、それをリアルなディスクと同じように扱うことで、データの保存場所を制御することができます。
- データのリダイレクション (Data Redirection):
- いくつかのソフトウェアやサービスは、データのリダイレクションをサポートしており、データの読み書きを別の場所にリダイレクトすることができます。
- ファイルシステムフィルタードライバ (File System Filter Driver):
- ファイルシステムフィルタードライバは、ファイルシステムの動作を変更し、データの保存場所をコントロールすることができます。
これらの方法は、技術的な知識が必要であり、またシステムやデータに影響を与える可能性があるため、慎重に行動することが重要です。また、これらの方法は、ソフトウェアのライセンス条項や利用規約に違反しないように注意することも重要です。
今回は、シンボリックリンクで問題を解決します。
シンボリックリンク(Symbolic Link、またはsymlink)は、ファイルシステム上の別のファイルやディレクトリへの参照となる特殊なファイルです。シンボリックリンクは、あるファイルやディレクトリへのショートカットと考えることができます。シンボリックリンクは、元のファイルやディレクトリのパスを保持し、アクセス時にそのパスにリダイレクトします。
ここでいくつかの主な点を説明します:
- 参照性:
- シンボリックリンクは、ターゲットとなるファイルやディレクトリへのポインタとして機能します。シンボリックリンク自体はターゲットの内容を持っていませんが、ターゲットのパスを保持しています。
- 相対パスと絶対パス:
- シンボリックリンクは、ターゲットへの相対パスまたは絶対パスを保持できます。
- 軽量:
- シンボリックリンクは、実際のデータを含まないため、ディスク上で非常に少量のスペースしか消費しません。
- 移植性:
- シンボリックリンクは、ターゲットとは異なるディレクトリやデバイスに作成できます。
- 作成と削除:
- シンボリックリンクを作成または削除すると、ターゲットファイルやディレクトリは影響を受けません。
シンボリックリンクは、特に大きなファイルシステムでのデータ管理や、プログラムの設定を柔軟に行う場合に便利です。また、シンボリックリンクは、UNIXおよびUNIXライクなオペレーティングシステム(LinuxやmacOSなど)で広く利用されています。Windowsでも、シンボリックリンクを作成することは可能ですが、それは「ショートカット」とは異なる概念であり、NTFSファイルシステム上でのみサポートされています。
WindowsとLinux環境で実践します。まずはWindows環境で設定をします。Windows環境で特定のフォルダにデータを保存するソフトウェアの制約を回避する方法の一例として、シンボリックリンクを利用する方法を説明します。シンボリックリンクは、あるディレクトリを別のディレクトリにリンクすることができるため、この方法が役立つかもしれません。まず、管理者としてコマンドプロンプトを開きます。コマンドプロンプトで以下のコマンドを入力し、エンターキーを押します。
mklink /D "リンク先のパス" "実際のデータのパス"
例えば、ソフトウェアがデータをC:\ProgramData\SoftwareData
に保存すると仮定し、実際のデータをD:\SharedData
に保存したい場合、以下のコマンドを入力します。ここで注意することがあります。既存のディレクトリがシンボリックリンクを作成しようとする場所に存在する場合、まず既存のディレクトリの名前を変更または移動する必要があります。これにより、シンボリックリンクを作成するための「空の場所」が確保されます。
mklink /D "C:\ProgramData\SoftwareData" "D:\SharedData"
これで、ソフトウェアはデータをC:\ProgramData\SoftwareData
に保存していると思い込み、実際にはデータはD:\SharedData
に保存されます。
注意:
- シンボリックリンクを作成する前に、
C:\ProgramData\SoftwareData
フォルダが存在しないか、または重要なデータが含まれていないことを確認してください。必要に応じて、フォルダを移動または削除してください。例(modelというフォルダ名を一時的にmodel1などとしておく) - シンボリックリンクは、ファイルとディレクトリの位置を変更することなく、ソフトウェアを別の場所にリダイレクトする方法を提供しますが、これにより予期しない動作や問題が発生する可能性があります。したがって、重要なデータのバックアップを取ってから、この方法を実行することを強くお勧めします。
実際の環境で入力したコマンドは以下になります。
mklink /D “C:\youtube\stable-diffusion-webui\models\Stable-diffusion” “F:\model”
FドライブはUSBですが、ネットワークドライブでも可能です。しかし、モデル読み込みに時間がかかります。複数のPCで使う分にはいいかもしれません。実際に画像を生成することもできました。
次はUbuntu Desktopの環境で確認します。
実際のUbuntu環境でシンボリックリンクを作成するためには、ln
コマンドを使用します。以下の手順で進めてください。
ターミナルを開く:
- Ubuntuのデスクトップで、ターミナルを開きます。
シンボリックリンクを作成する:
- ターミナルで、以下のコマンドを実行してシンボリックリンクを作成します。
ln -s <実際のデータのパス> <リンク先のパス>
例えば、実際のデータが /mnt/d/SharedData
にあり、それを /home/<your-username>/SoftwareData
にリンクする場合、以下のコマンドを実行します。
ln -s /mnt/d/SharedData /home/<your-username>/SoftwareData
確認する:
- シンボリックリンクが正しく作成されたことを確認するために、以下のコマンドを実行します。
ls -l <リンク先のパス>
注意点:
- UbuntuでWindowsのデータにアクセスする場合、通常は
/mnt/
の下のドライブレターを通じてアクセスします。たとえば、D:
ドライブは/mnt/d
としてアクセスします。しかし、これは通常のデュアルブート環境または仮想マシン環境ではなく、WSL環境での動作です。実際のUbuntu環境でWindowsのデータにアクセスするには、ネットワーク共有または他の方法を使用する必要があります。 - シンボリックリンクは参照先のファイルやディレクトリが存在することを前提としているため、リンクを作成する前に参照先のパスが正しいことを確認してください。
- シンボリックリンク作成時にエラーが発生する場合、権限の問題を確認してください。必要に応じて
sudo
コマンドを使用してシンボリックリンクを作成します。
実際に入力したコマンドが以下になります、USBにデータがあります。
ls -s /media/yourname/USBのボリューム名/model /home/mamushi/stable-diffusion-webui-docker/models/Stable-diffusion
通常は上記の方法で可能ですが、Docker版のstable diffusionでしたので、モデルにアクセスできず。
Dockerでの構築は以下のGitHubを利用しました。
次のことが重要でした。
Dockerコンテナ内でシンボリックリンクが正常に解決されないのは、シンボリックリンクのターゲットがコンテナ外のホストマシンに存在するためです。Dockerコンテナは独自のファイルシステムを持ち、ホストマシンのファイルシステムから隔離されています。これにより、コンテナ内からホストマシンのファイルやディレクトリに直接アクセスすることはできません。
ホストマシン上で後からディレクトリを作成しても、それがDockerコンテナ内で自動的に利用可能になるわけではありません。コンテナ内からホストマシン上のディレクトリにアクセスするには、Dockerのマウント機能を利用して明示的にそのディレクトリをコンテナ内にマウントする必要があります。これは、docker run
コマンドの-v
または--volume
オプションを使用するか、docker-compose.yml
ファイルのvolumes
セクションを編集することで行えます。
そこで、docker-compose.yml
に修正を加えました。コンテナ内を解析すると、/data/models/Stable-diffusionディレクトリがモデルの配置場所でした。
x-base_service: &base_service
...
volumes:
- &v1 ./data:/data
- &v2 ./output:/output
- /media/mamushi/UBUNTU-SERV/model:/data/models/Stable-diffusion # 追加する行
...
USBドライブに既定の場所をマウントすると、モデルを読み込むことができます。