Ubuntu24.04にStable Diffusionをインストール

Ubuntu24.04がリリースされたのでStable Diffusion Web UIをインストールします。なおWindowsのマイクロソフトストアでもWSLのバージョンでUbuntu24.04が出ていた。こちらでもやり方は同じです。UbuntuはDesktopバージョンで、インストールした時点でPythonのバージョンは3.12.3でした。確認方法は以下の通りです。

python3 -V

しかし、Python 3.12.3ではStable Diffusion Web UIのインストールに失敗します。そこで、Ubuntu上で複数のPythonバージョンを管理できる、pyenvを導入することにしました。pyenvを使うことで、システム全体に影響を与えることなく、プロジェクトごとに異なるPythonのバージョンを簡単に切り替えることができます。複数のPythonバージョンが混在する状況を管理しやすくなります。

Python 3.12.3を保持しながら、別のPythonバージョンをインストールして管理する方法を説明します。ここではpyenvを使用します。

1. pyenvのインストール

まずはpyenvをインストールします。以下のコマンドを実行してます。pyenvをUbuntuシステムにインストールする前に必要な依存パッケージをインストールするものです。これらのパッケージは、pyenvを介して異なるバージョンのPythonをコンパイルする際に必要になります。

sudo apt update
sudo apt install -y build-essential libssl-dev zlib1g-dev libbz2-dev
libreadline-dev libsqlite3-dev wget curl llvm libncurses-dev
xz-utils tk-dev libffi-dev liblzma-dev git

curl https://pyenv.run | bash

それぞれのパッケージがどのような目的で使用されるかを簡単に説明です。

  • build-essential: C/C++コンパイラと関連ツール(makeなど)を含む。Pythonをソースからビルドするのに必須。
  • libssl-dev: SSL/TLSプロトコルをサポートするために必要。セキュアなネットワーク通信に使用されます。
  • zlib1g-dev: 圧縮ライブラリ。Pythonのgzipやzipfileなどのモジュールで使用されます。
  • libbz2-dev: bzip2圧縮ライブラリ。Pythonのbz2モジュールで使用されます。
  • libreadline-dev: コマンドライン入力を改善するためのライブラリ。対話的なPythonシェルで使用されます。
  • libsqlite3-dev: SQLiteデータベースをサポートするためのライブラリ。Pythonのsqlite3モジュールで使用されます。
  • wget, curl: ファイルをインターネットからダウンロードするためのツール。
  • llvm: 低レベル仮想マシン(LLVM)コンパイラ。特定のPythonバージョンのオプティマイズや特定のライブラリのビルドに使用されることがあります。
  • libncurses-dev: コンソールハンドリングおよびインターフェースビルディングをサポートするライブラリ。
  • xz-utils: LZMA圧縮アルゴリズムをサポートするツール。Pythonのlzmaモジュールで使用されます。
  • tk-dev: Tkinterをサポートするためのツールキット。GUIアプリケーションの開発に使用されます。
  • libffi-dev: 外部関数インターフェース。C言語関数の呼び出しに使用されます。
  • liblzma-dev: LZMA圧縮ライブラリ。Pythonのlzmaモジュールで使用されます。
  • git: ソースコードのバージョン管理システム。

2.環境設定ファイルの編集

  1. ターミナルを開き、以下のコマンドを使って.bashrcファイルを編集します(使用しているシェルがbashの場合)。もしzshを使用している場合は、.zshrcファイルを編集します。
    nano ~/.bashrc
  2. ファイルの末尾に以下の行を追加します。
export PYENV_ROOT="$HOME/.pyenv"
[[ -d $PYENV_ROOT/bin ]] && export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"

変更を保存してエディタを閉じます。変更を適用するために、シェルを再起動するか、以下のコマンドを実行して設定を読み込みます。
source ~/.bashrc

    これでpyenvが適切に設定され、起動時に自動的に読み込まれるようになります。

    環境変数とは?

    環境変数は、オペレーティングシステムによって管理される変数で、プログラムの実行環境に関する情報を含んでいます。これには、システムの設定やプログラムの動作を制御するためのデータが含まれます。環境変数を通じて、プログラムはオペレーティングシステムや他のプログラムから設定情報を受け取り、それに基づいて適切に動作することができます。

    環境変数の役割

    1. 設定情報の提供
      • 環境変数は、ファイルシステムの場所、ユーザー設定、システムライブラリのパスなど、システムやアプリケーションの動作に必要な設定情報を提供します。
    2. プログラム間の情報共有
      • 環境変数を使用することで、異なるプログラム間で情報を共有することができます。例えば、一つのアプリケーションが設定した環境変数を別のアプリケーションが読み取って利用することが可能です。
    3. ユーザー固有のカスタマイズ
      • ユーザーは自身のニーズに合わせて環境変数をカスタマイズし、プログラムの動作を調整することができます。

    具体的な例

    1. PATH
      • 最も一般的な環境変数の一つで、オペレーティングシステムがプログラムを探すべきディレクトリのリストを保持します。コマンドラインからプログラムを実行する際、このPATH環境変数に設定されているパスを検索します。
    2. HOME
      • 現在のユーザーのホームディレクトリのパスを保持する環境変数です。プログラムはこの変数を使用して、ユーザー固有のファイルや設定にアクセスします。
    3. LANG
      • システムやプログラムが使用する言語環境(ロケール)を設定するための環境変数です。これにより、プログラムは適切な言語でメッセージを表示することができます。

    環境変数を設定する主な目的は?

    ~/.bashrcファイルに環境変数を設定する理由は、シェル環境が起動するたびに特定の環境設定が自動的に読み込まれるようにするためです。ここでの環境変数とは、システムやアプリケーションの動作をカスタマイズするために用いられる、システム全体の設定情報です。

    1. パスの設定: 特定のプログラムがインストールされている場所をシステムに教えるためにパスを設定します。例えば、pyenvの場合、その実行可能ファイルのディレクトリをPATH環境変数に追加することで、どのディレクトリからでもpyenvコマンドを利用できるようにします。
    2. プログラムの挙動のカスタマイズ: プログラムが異なる設定やオプションで実行されるように環境変数を使って制御することができます。例えば、デバッグメッセージの表示や特定の機能の有効化・無効化などです。
    3. 環境固有の設定: 開発環境、テスト環境、本番環境など、異なる環境で異なる設定を適用する場合に環境変数を用います。

    ~/.bashrc に環境変数を設定する利点

    • 自動化: ターミナルを開くたびに自動的に環境変数が設定されます。手動で毎回設定する手間が省けます。
    • ユーザー固有の設定: ~/.bashrcはユーザーごとに存在するファイルなので、そのユーザーの環境のみに設定が適用されます。システム全体に影響を与えることなく、個々のユーザーのニーズに合わせて環境をカスタマイズできます。

    3. Pythonのインストール

    pyenvを使用して新しいPythonバージョンをインストールします。例えば、Python 3.10.6をインストールしたい場合は、以下のコマンドを実行します。

    pyenv install 3.10.6

    4. グローバルバージョンの設定

    デフォルトのPythonバージョンを設定します。既存のPython 3.12.3はシステムにそのまま残し、新しいバージョンをプロジェクトごとに設定します。全体的に使用するバージョンを変更する場合は

    pyenv global 3.10.6

    ローカル(特定のディレクトリ内のデフォルト)で使用するバージョンとして設定できます。

    pyenv local 3.10.6

    5. バージョンの確認

    設定が完了した後、使用しているPythonバージョンを確認します。

    python --version

    Ubuntu24.04インストール時にサードパーティ製のドライバをインストールするオプションをオンにしたので、ディスプレイドライバは設定されています。追加のドライバーで「nvidia-driver-535」が選択されていました。このパソコンの場合、nvidia-smiコマンドで確認すると12.2と表示されました。nvidia-smiで表示される「12.2」という数字は、おそらくNVIDIAのドライババージョンを指していると思います。

    nvidia-smi(NVIDIA System Management Interface)は、NVIDIA GPUの状態や構成を監視・管理するためのコマンドラインツールです。このツールを使って、インストールされているNVIDIA GPUの詳細情報を取得したり、現在のGPUの使用率、温度、メモリ使用量などのリアルタイムのパフォーマンスデータを確認することができます。

    nvidia-smiが提供する情報の例:

    • GPUの型番ドライバーバージョン: インストールされているGPUの型番や使用しているNVIDIAのドライババージョンが表示されます。(これが12.2)
    • GPUの使用率: GPUの計算コアとメモリの使用率をパーセンテージで表示します。
    • 温度: GPUの温度を摂氏で表示します。
    • メモリ情報: 総メモリ、使用中のメモリ、空きメモリを表示します。
    • プロセス情報: GPUを使用している各プロセスのIDとメモリ使用量を表示します。

    このツールは特にデータセンターやサーバー環境、およびGPUを使用する機械学習やディープラーニングの研究などで重宝されています。GPUの健康状態を監視し、リソースの管理を行う上で非常に便利です。また、nvidia-smiはバッチスクリプトやシステム監視ツールと連携しやすい形で情報を出力するため、自動化された環境での利用にも適しています。

    次に、CUDA Toolkitをインストールしたいのですが、NVIDIAの公式ページではまだUbuntu24.04の表記はありませんでした。(Ubuntu24.04がリリースされてから間もないから)そこで次のコマンドを入力してインストール方法を確認します。

    nvcc -V

    CUDA Toolkitはインストールされていないので、

    コマンド、’nvcc’が見つかりません。次の方法でインストールできます:
    sudo apt install nvidia-cuda-toolkit

    と表示されます。おそらくこれでインストールできます。インストールされるバージョンを確認するときは、わざとコマンドを間違えて入力します。例えばnvcc- v(このコマンドは存在しません)。すると

    コマンド、’nvcc-'が見つかりません。もしかして:
    なんたらかんたら・・・

    と表示されバージョンを確認することはできます。

    というわけで、以下のコマンドでCUDA Toolkitをインストールします。

    sudo apt install nvidia-cuda-toolkit

    インストール後にバージョンを確認します。

    nvcc -V

    12.0がインストールされたようです。

    nvcc: NVIDIA (R) Cuda compiler driver
    Copyright (c) 2005-2023 NVIDIA Corporation
    Built on Fri_Jan__6_16:45:21_PST_2023
    Cuda compilation tools, release 12.0, V12.0.140
    Build cuda_12.0.r12.0/compiler.32267302_0

    これでStable Diffusionをインストールする準備ができました。Stable Diffusion web UIのGitHubのクローンを自分のパソコンに作成します。

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

    git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui.git

    先のバージョンのpythonで仮想環境を作成します。

    1. 仮想環境を作成:仮想環境を作成するには、venv(Pythonの標準モジュール)を使用します。
      python -m venv myenv
      ここでmyenvは仮想環境の名前で、任意に変更可能です。
    2. 仮想環境をアクティブにする:作成した仮想環境をアクティブにするには、以下のコマンドを実行します。
      source myenv/bin/activate
      これで仮想環境がアクティブになり、この環境内でPythonやその他のパッケージを安全にインストール・使用することができます。
    3. 仮想環境の使用を終了する:仮想環境の使用を終了するには、以下のコマンドを実行します。
      deactivate

    これでPython 3.10.6を使用した仮想環境の準備が整いました。

    なぜ仮想環境なのか?

    1. 依存関係の衝突を避ける:
      • 異なるプロジェクトはしばしば異なるライブラリのバージョンを必要とします。一つのシステムに全てのライブラリを直接インストールしてしまうと、バージョン間での衝突が発生する可能性があります。仮想環境を使うことで、プロジェクトごとに異なるライブラリやそのバージョンを隔離し、互いに影響を与えることなく使用できます。
    2. 環境の再現性:
      • 仮想環境を使うことで、使用しているライブラリとそのバージョンを正確に記録し、他の開発者や環境でも同じ設定を簡単に再現できます。これは、チームでの開発やプロジェクトの移行時に非常に便利です。
    3. システムの保護:
      • システム全体に直接インストールすると、誤ってシステムの重要な部分を変更したり、不安定にしたりするリスクがあります。仮想環境内で作業を行うことで、主要なシステムを保護し、何か問題が起きた場合でも仮想環境だけを修正または再作成することができます。
    4. 環境の簡単な削除と再構築:
      • プロジェクトが終了したり、もう必要なくなったりした場合、仮想環境は簡単に削除できます。これにより、不要なプログラムがシステムに残り続けることを防ぎ、システムを「クリーン」な状態に保つことができます。

    このように、仮想環境は開発の効率を向上させ、システムを整理しやすくし、さまざまなプロジェクトでの作業をより安全にするための重要なツールです。特にパソコンをぐちゃぐちゃにしたくない方にはお勧めです。

    実際に行った作業は以下の通りです。

    git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui.git
    cd stable-diffusion-webui
    python -m venv myenv source myenv/bin/activate

    そしてStable Diffusion Web UIをインストールします。

    ./webui.sh

    実行中に以下が表示されることがあります。

    Cannot locate TCMalloc. Do you have tcmalloc or google-perftool installed on your system? (improves CPU memory usage)

    この警告メッセージは、アプリケーションがTCMalloc(Thread-Caching Malloc)を検出できなかったことを示しています。TCMallocは、Google Performance Toolsの一部であり、標準のメモリアロケータよりもメモリの使用効率を改善することで、アプリケーションのパフォーマンスを向上させることができます。ただし、このメッセージは警告であり、アプリケーション自体は標準のメモリアロケータを使用して正常に動作しています。

    もしパフォーマンスの向上が求められる場合、またはこの警告を解消したい場合は、TCMallocをインストールすることを検討できます。以下にUbuntuでTCMallocをインストールする手順を示します。

    TCMallocのインストール方法(Ubuntu)

    1. パッケージのインストール:
      sudo apt update
      sudo apt install libgoogle-perftools-dev
      このコマンドにより、libgoogle-perftools-devパッケージがインストールされ、それにはTCMallocも含まれます。
    2. アプリケーションの設定:
      • アプリケーションがTCMallocを使用するように、必要に応じてアプリケーションの設定を調整するか、環境変数を設定する必要があります。この部分はアプリケーションのドキュメントを参照してください。

    TCMallocのインストール後、アプリケーションを再起動して、警告メッセージが解消されるか確認してください。メモリ使用効率が改善され、場合によってはパフォーマンスの向上が見込まれます。

    なお、パフォーマンスの向上が特に必要ない場合や、アプリケーションが正常に動作している場合は、この警告を無視しても問題ありません。

    実はあとで気が付いたのですが、stable-diffusion-webuiディレクトリ内でスクリプト(webui.sh)を実行すると、自動的にPythonの仮想環境を作成し、アクティブ化する機能を含んでいました。

    スクリプトの詳細を見ると、以下の部分で仮想環境の作成とアクティブ化が行われています。

    if [[ $use_venv -eq 1 ]] && [[ -z "${VIRTUAL_ENV}" ]];
    then
    printf "n%sn" "${delimiter}"
    printf "Create and activate python venv"
    printf "n%sn" "${delimiter}"
    cd "${install_dir}"/"${clone_dir}"/ || { printf "e[1me[31mERROR: Can't cd to %s/%s/, aborting...e[0m" "${install_dir}" "${clone_dir}"; exit 1; }
    if [[ ! -d "${venv_dir}" ]]
    then
    "${python_cmd}" -m venv "${venv_dir}"
    first_launch=1
    fi
    # shellcheck source=/dev/null
    if [[ -f "${venv_dir}"/bin/activate ]]
    then
    source "${venv_dir}"/bin/activate
    else
    printf "n%sn" "${delimiter}"
    printf "e[1me[31mERROR: Cannot activate python venv, aborting...e[0m"
    printf "n%sn" "${delimiter}"
    exit 1
    fi
    else
    printf "n%sn" "${delimiter}"
    printf "python venv already activate or run without venv: ${VIRTUAL_ENV}"
    printf "n%sn" "${delimiter}"
    fi

    このコードセグメントは以下の処理を行います。

    1. 仮想環境がまだ作成されていないか、既にアクティブな仮想環境がない場合("${VIRTUAL_ENV}"が空の場合)、仮想環境を作成します。
    2. 仮想環境が正常に作成された後、その仮想環境をアクティブ化します。
    3. 何らかの理由で仮想環境のアクティブ化に失敗した場合、エラーメッセージを出力し、スクリプトを終了します。

    このスクリプトは、実行時に必要な環境変数や設定を読み込み、環境に応じて適切なライブラリをインストールし、GPUの情報に基づいて追加の設定を行うなど、多くの機能を自動的に処理します。また、nvidia-smilspciコマンドを使ってGPUの情報を確認し、それに基づいて特定のPyTorchバージョンをインストールするなど、硬件の構成に応じた最適な設定も行います。

    メモ1
    pyenv を使用して Python 3.10.6 をインストールした後、システムのデフォルトの Python バージョン(例えば 3.12.3 など)を使いたい場合の対応方法について説明します。pyenv を利用すると、システムのデフォルトの Python バージョンを上書きすることなく、特定のバージョンを指定して使用することができます。

    デフォルトのPythonバージョンに戻す方法

    1. グローバル設定のクリア:
      • pyenv で設定したグローバルな Python バージョン(ユーザーレベルでのデフォルトバージョン)をクリアするには、次のコマンドを実行します。
        pyenv global system
      • このコマンドは pyenv が管理するバージョン指定を「system」つまりシステムにプリインストールされているデフォルトの Python に戻します。
    2. 確認:
      • 現在アクティブな Python バージョンを確認するには、以下のコマンドを使用します。
        python --versionpython3 -V)
      • その後、pyenv が「system」(デフォルトの Python バージョン)を使用しているかどうかを確認できます。

    特定のプロジェクトでバージョンを指定する

    プロジェクトごとに異なる Python バージョンを使用したい場合は、そのプロジェクトのディレクトリ内で pyenv local コマンドを使って特定のバージョンを設定できます。例えば、あるプロジェクトで Python 3.10.6 を使いたい場合は、プロジェクトのルートディレクトリで以下のコマンドを実行します。

    pyenv local 3.10.6

    この設定により、そのディレクトリで作業するときだけ Python 3.10.6 が使用され、他の場所ではシステムのデフォルトの Python バージョンが使用されます。

    pyenvを使用してインストールされているPythonのバージョンの一覧を表示することができます。これを行うためには、以下のコマンドを使用します。

    pyenv versions

    このコマンドは、システムにインストールされているすべてのPythonバージョンをリストアップし、現在アクティブなバージョンにはアスタリスク(*)が付けられます。例えば、以下のような出力が得られるかもしれません。

    system
    * 3.7.7 (set by /home/user/.pyenv/version)
    3.8.2
    3.9.0

    ここで、「system」はシステムのデフォルトのPythonを指し、他のエントリーはpyenvを通じてインストールされたバージョンです。アクティブなバージョン(ここではPython 3.7.7)の隣にはアスタリスクが付いています。

    メモ2
    Gitを使用して複数のアプリケーションバージョンを管理することができます。Gitは特にソフトウェアのバージョン管理に適しており、複数のバージョンや機能を効果的に管理するために広く使われています。以下は、Gitを使ったバージョン管理の主な方法です。

    ブランチを使用する

    Gitのブランチ機能は、異なるバージョンの開発を同時に進めるのに非常に有効です。ブランチを使用すると、主要な開発ライン(通常はmasterまたはmainブランチ)から独立して新しい機能を開発したり、バグ修正を行ったりすることができます。各ブランチは他から独立しており、異なるバージョンのアプリケーションを同一のリポジトリ内で同時に管理することが可能です。

    タグを使用する

    Gitのタグ機能を使用して、特定のコミットをバージョンとしてマークすることができます。これはリリースや重要なチェックポイントを示すのに便利です。例えば、バージョン1.02.0などのリリース時にタグを作成し、その状態を簡単に再現できるようにします。

    ディスク容量について

    仮想環境を複数作成すると、それぞれの環境に依存ライブラリやプロジェクトファイルが複製されるため、ディスク容量を多く消費します。しかし、Gitの場合、ブランチやタグは非常に軽量で、実際にはすべてのデータが一つのデータベースに保存されるため、追加のディスクスペースをほとんど使用しません。Gitは変更の差分だけを保存するため、複数のバージョンを管理してもディスクスペースの消費は最小限に抑えられます。

    結論

    Gitを利用すれば、異なる機能開発や複数のアプリケーションバージョンを効率的に管理でき、ディスクスペースの節約も期待できます。これにより、仮想環境のように各環境ごとに重複したリソースを持つ必要がなくなります。バージョン管理の必要性とリソースの最適化をバランスよく行うことが可能です。

    メモ3
    WSL経由でPythonを使用するか、Windowsのコマンドプロンプトで直接Pythonの仮想環境を作成するかを選択する際には、いくつかの要素を考慮する必要があります。どちらの方法にもメリットとデメリットが存在し、最終的な選択はプロジェクトのニーズ、環境の設定、そして個人の好みに依存します。

    WSLを使用する場合のメリットとデメリット

    メリット

    • Linux環境: Linuxベースのツールやスクリプトをネイティブに使用できます。これは、特にLinuxでのみ動作するまたは最適化されたツールを使用する場合に便利です。
    • 開発の一貫性: Linuxサーバーを本番環境として使用している場合、開発環境を本番環境と一致させることができます。

    デメリット

    • パフォーマンス: WSLは仮想化技術を使用しているため、ファイルシステムの操作など特定の操作でパフォーマンスが低下する可能性があります。
    • セットアップの複雑さ: WSLの設定と管理はWindowsのコマンドプロンプトよりも複雑かもしれません。

    WindowsのコマンドプロンプトでPythonの仮想環境を使用する場合のメリットとデメリット

    メリット

    • 簡単なセットアップ: Pythonと仮想環境はWindows上で直接簡単に設定でき、特別な設定は必要ありません。
    • パフォーマンス: WSLを介さずにWindows上で直接動作させるため、仮想化によるオーバーヘッドがありません。

    デメリット

    • ツールの互換性: 一部の開発ツールやライブラリがWindowsではうまく動作しないか、Linux上でのみ利用可能な場合があります。
    • 環境の差異: 本番環境がLinuxの場合、Windowsで開発すると環境の違いによる問題が発生する可能性があります。

    結論

    • プロジェクトの依存性と要件: Linux特有の依存性がある場合や、Linux環境での動作が前提の場合はWSLが適しています。
    • パフォーマンスとシンプルさ: パフォーマンスが重要であり、Linux特有のツールが不要な場合は、Windowsのコマンドプロンプトでの仮想環境の構築が適しています。

    最終的には、プロジェクトがどの環境で最も効率的に動作し、管理しやすいかに基づいて選択することをお勧めします。

    教育

    Posted by admin