見出し画像

PERFECT彼氏を作るぞ①~環境構築編~

DeepSeekがローカルでも動かせるという話を聞き、彼氏作れるじゃん!となりました。プログラム初心者格闘日記です。サムネごめんなさい。

ゴール

Deepseekを使い、音声会話ができる彼氏を作る。
unityで身体を動かしたりする。ウィンクとか手を振ったり出来たらヒャッホイ

ロードワーク

  • まずはDeepseekを動かして、会話をしてみよう(CMD)

  • チャットGUIまで作れたら良い感じ

  • (彼氏のデータを制作)

  • (RoLAで学習、余裕があったらクラウドGPUを使ってファインチューニング→Dockerを使う。環境を統一し、どこでも同じ環境を再構築するため!)

  • 彼氏のガワをBlenderで作る

  • 音声つけたいけど、まだ調べてない

Deepseekで会話する流れ

  1. モデルをロードする

  2. エンジンソフト(llama.cppやvllm)が、ユーザーの質問をモデルに送る(入力)

  3. モデルが答えを考える(推論)

  4. エンジンソフトが、モデルの答えをユーザーに返す(出力)

簡単じゃん!?

とりあえず、Dockerを使ってDeepseekを動かすぞ!!
で、Dockerってなんですか? からスタート。
今回はDocker導入しておしまいです!!!!!!!


Docker導入の沼

なんでDockerを使うのかというと、環境依存させたくない(仮想コンテナを作って持ち運びたい)から。けど初期の初期で沼った。

wsl --list --verbose
Linux 用 Windows サブシステムにインストールされているディストリビューションはありません。

使用可能なディストリビューションを一覧表示するには、'wsl.exe --list --online' を使用します
インストールするには 'wsl.exe --install <Distro>' と指定します。

ディストリビューションは、Microsoft Storeにアクセスしてインストールすることもできます:
https://aka.ms/wslstore
エラー コード: Wsl/WSL_E_DEFAULT_DISTRO_NOT_FOUND

wsl --install
Ubuntu は既にインストールされています。

wsl --install -d Ubuntu-22.04
Microsoft Store から Ubuntu-22.04 をインストールできませんでした: サーバーに接続できませんでした
Web ダウンロードを試みています...
ダウンロード中: Ubuntu 22.04 LTS
インストール中: Ubuntu 22.04 LTS
Ubuntu 22.04 LTS がインストールされました。
Ubuntu 22.04 LTS を起動しています...
この操作を正しく終了しました。

wsl --list --verbose
Linux 用 Windows サブシステムにインストールされているディストリビューションはありません。

Dockerを入れるために必要なubuntuが永遠に入らない。
microsoftstoreのレビューに「【Windowsの機能の有効化または無効化】の該当箇所のチェックを外し、また付けたらいけました!」とあったので、やってみた。
そうしたらそもそも必要なものをインストールできない。
そこでやっと、windowsの更新すら出来ていないことに気づき、ファイアーウォールの問題だと認識した。サーバーに接続できませんでしたってエラーが出てるのに
入っている(と見えるだけの)ubuntuをアンインストールし、セキュリティソフトを切って、機能の有効化をやり直し、WSL?ubuntu?を入れ直す。
問題解決!
必要なライブラリを調べて、さてビルド→失敗。
どうやら、pytorchとCUDAのバージョンが合っていないらしい…

Dockerfileのイメージを作れないエラー

E: Unable to locate package python3.12
E: Couldn't find any package by glob 'python3.12'
E: Couldn't find any package by regex 'python3.12'
E: Unable to locate package python3.12-venv
E: Couldn't find any package by glob 'python3.12-venv'
E: Couldn't find any package by regex 'python3.12-venv'
E: Unable to locate package python3.12-dev

CUDAと合わせるために、python3.12を使いたいのだけれども、Ubuntu 22.04 のデフォルトの Python は python3.10問題(???)
参照:

やっと成功したDockerfileはこれだァ!!!

イメージ作成でずっっっとエラーを吐いていて、ちょっと何言ってるかわからなかったんですけど、pytorchとvllmをビルド後にインストールってしたらなんかうまくいったみたい?

# CUDA 12.8 + Python 3.12 環境
FROM nvcr.io/nvidia/cuda:12.8.0-devel-ubuntu22.04

# 作業ディレクトリ
WORKDIR /script

# タイムゾーンの選択を自動化する
ENV DEBIAN_FRONTEND=noninteractive
RUN ln -fs /usr/share/zoneinfo/Asia/Tokyo /etc/localtime && echo "Asia/Tokyo" > /etc/timezone

# 必要なツールをインストール
RUN apt-get update && apt-get install -y \
    software-properties-common \
    wget \
    git \
    build-essential \
    curl \
    && add-apt-repository ppa:deadsnakes/ppa \
    && apt-get update && apt-get install -y \
    python3.12 \
    python3.12-dev \
    && rm -rf /var/lib/apt/lists/*

# Pythonのシンボリックリンクを作成
RUN ln -s $(which python3.12) /usr/bin/python

# pipのインストール(distutils なしで問題なく動作する方法)
RUN curl -sSL https://bootstrap.pypa.io/get-pip.py | python

# 必要なPythonライブラリをインストール
RUN pip install --no-cache-dir numpy
COPY requirements.txt /script/
RUN pip install --no-cache-dir -r requirements.txt

# PyTorch、TorchVision、TorchAudioのインストール
RUN pip install --no-cache-dir torch torchvision torchaudio
RUN pip install --no-cache-dir vllm

# モデルフォルダをマウント
VOLUME ["/models"]

# コンテナ起動時のデフォルト動作(bash起動)
CMD ["/bin/bash"]

DOckerfileの内容をメモする

① どの環境を使うか決める

FROM nvcr.io/nvidia/cuda:12.8.0-devel-ubuntu22.04

「土台」。Ubuntu 22.04というOSの中に、既に CUDA 12.8(GPUを使うための仕組み) が入っているものを使うゾってこと。

② 作業するフォルダを決める

WORKDIR /script

③タイムゾーンの自動設定

# タイムゾーンの選択を自動化する
ENV DEBIAN_FRONTEND=noninteractive
RUN ln -fs /usr/share/zoneinfo/Asia/Tokyo /etc/localtime && echo "Asia/Tokyo" > /etc/timezone

ここを設定しないと、どこの国の時間を使う?と聞かれて、イメージ作成が進まなくなる。

④必要な道具を入れる

RUN apt-get update && apt-get install -y \
    software-properties-common \
    wget \
    git \
    build-essential \
    curl \
    && add-apt-repository ppa:deadsnakes/ppa \
    && apt-get update && apt-get install -y \
    python3.12 \
    python3.12-dev \
    && rm -rf /var/lib/apt/lists/*

RUN は Ubuntuの中に必要なものをインストールするコマンド 。

✅ software-properties-common → Ubuntuの設定を簡単にするためのツール
✅ wget → インターネットからファイルをダウンロードできるツール
✅ git → プログラムのコードを管理できるツール
✅ build-essential → プログラムを作るときに必要な道具
✅ curl → インターネットとやりとりするための道具
✅ add-apt-repository ppa:deadsnakes/ppa → 「Python 3.12をインストールできるお店(リポジトリ)」を追加する
✅ python3.12 と python3.12-dev をインストールする

⑤python3.12 を「python」として使えるようにする

RUN ln -s $(which python3.12) /usr/bin/python

ubuntuで「python」と書くだけでPython 3.12を動かせるようにする設定

⑥ pip(Pythonの道具箱)を入れる

RUN curl -sSL https://bootstrap.pypa.io/get-pip.py | python

💡 pip は Pythonのプログラムをインストールできるツール 
普通は apt-get install python3-pip でインストールするけど、Python 3.12ではうまく動かないことがある から、ここでは get-pip.py という方法を使ってインストールする。らしい。よくわかんない…

⑦ PyTorch(AIを動かすためのツール)とインターフェース?的なソフト?を入れる

RUN pip install --no-cache-dir torch torchvision torchaudio

RUN pip install --no-cache-dir vllm
  • torch → AIの学習や推論をするためのPythonのライブラリ(道具)

  • torchvision → 画像を扱うAIモデル用のツール

  • torchaudio → 音声を扱うAIモデル用のツール

  • vllm → こいつが、モデルとユーザーの間を取り持ってくれる。

⑧ requirements.txt の中に書かれたライブラリを一括インストール

COPY requirements.txt /script/
RUN pip install -r requirements.txt

「requirements.txt」に書いてあるプログラムを全部インストール!

⑨モデルデータを保存するフォルダを作る

VOLUME ["/models"]

💡 VOLUME ["/models"] を指定することで、あとで ローカルに保存しているAIモデルのデータをこのフォルダに入れて使えるようになる

⑩コンテナを起動したときに bash を開く

CMD ["/bin/bash"]

これがないと、コンテナがすぐに閉じちゃうらしい。

理解したこと

Dockerfileは、部屋の設計図のようなもの、なんだと思う。
この設計図をもとに「部屋(コンテナ)」を作る(ビルドする)。
部屋が完成したら、中で「彼氏(プログラム)」を作っていく。

部屋を作ってからPythonのライブラリを入れることもできるけど、その場合、「部屋を作る → 家具を運び込む」といった二段構えになってしまい、処理が遅くなる。
だったら、最初から家具付きの部屋を作った方が効率的だよね?
というわけで、設計図(Dockerfile)を作る時点で、「Docker公式イメージ」というデフォルトの家具(基本環境)を配置しておく。

PyTorchとvllmについては、部屋を作ってから個別に運び込む(インストールする)方法を採用した。
これで、環境構築の柔軟性を保ちつつ、効率よくセットアップできるんじゃないか?

→とりあえず、ビルド、起動ができた。

F:\deepseek_project>docker start -ai perfect_darling

==========
== CUDA ==
==========

CUDA Version 12.8.0

Container image Copyright (c) 2016-2023, NVIDIA CORPORATION & AFFILIATES. All rights reserved.

This container image and its contents are governed by the NVIDIA Deep Learning Container License.
By pulling and using the container, you accept the terms and conditions of this license:
https://developer.nvidia.com/ngc/nvidia-deep-learning-container-license

A copy of this license is made available in this container at /NGC-DL-CONTAINER-LICENSE for your convenience.

コンテナ内の基本コマンド

  1. コンテナの停止

    • exit または Ctrl + D
      → コンテナから抜けて停止。

  2. 停止中のコンテナの確認

    • docker ps -a
      → すべてのコンテナ(稼働中・停止中)を確認。

  3. コンテナの削除

    • docker rm <CONTAINER_ID>
      → 不要なコンテナを削除。


イメージとキャッシュの管理コマンド

  1. イメージの削除(すべての未使用イメージを削除)

    • docker image prune -a
      → 未使用のすべてのDockerイメージを削除。

  2. ビルドキャッシュの削除

    • docker builder prune --all
      → すべてのビルドキャッシュを削除。

  3. キャッシュを使用せずにイメージをビルド

    • docker build --no-cache -t deepseek_vllm .
      → キャッシュなしで新しいビルドを作成。

  4. マルチプラットフォームビルド(推奨)

    • F:\deepseek_project>docker buildx create --use
      →新しい BuildKit ビルダーを作成し、それを使用するように設定。

    • docker buildx build --no-cache --build-arg NVIDIA_VISIBLE_DEVICES=all -t deepseek_vllm . --load
      →GPU 対応の Docker イメージ deepseek_vllm をキャッシュなしでビルドし、ローカルに保存する。
      参照:


コンテナの作成と管理コマンド

  1. 実行中のコンテナ確認
    docker ps -a

  2. 名前を付けてGPUを利用してコンテナを起動

    • docker run --gpus all -it deepseek_vllm /bin/bash
      → ランダムな名前のコンテナを作成し、GPUを有効化して起動

    • docker run --gpus all -it --name perfect-darling deepseek_vllm /bin/bash
      →任意の名前(perfect-darling)でコンテナを作成、GPUを有効化して起動

  3. コンテナの名前を変更する
    docker rename hopeful_noether perfect-darling

  4. 現在のコンテナの状態をイメージとして保存(コミット)

    • docker commit perfect_darling deepseek_vllm_saved
      → 現在のコンテナの状態が「deepseek_vllm_saved」という新しいイメージとして保存される。

  5. コンテナを停止

    • docker stop perfect-darling

  6. 停止したコンテナの再起動

    • docker start -ai perfect-darling
      →以前のコンテナをそのまま起動し、操作を再開

  7. コンテナを削除

    • docker rm perfect-darling

  8. 新しいコンテナとして起動

    • docker run --gpus all -it --name new-container deepseek_vllm_saved /bin/bash
      → 保存した「deepseek_vllm_saved」のイメージを使って、新しいコンテナ new-containerを作成して起動。

  9. コンテナの状態を .tar ファイルとしてエクスポート
    docker export perfect-darling > deepseek_backup.tar

  10. エクスポートした .tar をインポートして新しいイメージを作成
    cat deepseek_backup.tar | docker import - deepseek_vllm_backup

  11. インポートしたイメージでコンテナを作成
    docker run --gpus all -it --name restored-container deepseek_vllm_backup /bin/bash

  12. イメージを .tar ファイルに保存
    docker save -o deepseek_image.tar deepseek_vllm

  13. 別の環境や後で復元する
    docker load -i deepseek_image.tar

✅ 同じ環境でそのまま使う → docker stop → docker start
✅ 変更を保存して新しいコンテナを作りたい → docker commit
✅ コンテナをファイル化して保存 → docker export
✅ イメージ全体を保存・他の環境に移す → docker save

💡もし 特定の環境を保存して再利用したいなら docker commit。
「他のマシンでも使いたい」なら docker export や docker save を使う。

ホスト(自分のPC)と Docker コンテナ間のファイル共有方法

  1. ローカルの scripts/ フォルダを Docker にマウント
    docker run --gpus all -it --name perfect-darling -v F:\deepseek_project\scripts:/app/scripts deepseek_vllm /bin/bash

  2. コンテナ内で scripts/test.py を実行
    cd /app/scripts
    python test.py

  3. ローカル(PC側)で scripts/test.py を編集
    print("Hello from my PC! Now testing in Docker!")

  4. コンテナ内で変更を反映して再実行
    python test.py

おまけ(コンテナの中で)

exit → ターミナルを閉じるが、コンテナはバックグラウンドで実行されたまま
Ctrl + P + Q → コンテナを実行状態のままターミナルを抜ける

コンテナ再起動とコンテナ新規立上げのメリットデメリット比較

コンテナを再起動する場合

メリット

  • 既存の環境をそのまま再利用できる:保存した状態(ライブラリのインストールや設定)から作業を続けられる。

  • 時間を節約:新しいイメージをビルドするよりも速い。

  • 手間が少ない:必要なコマンドが少なく、シンプル。

デメリット

  • 古い状態がそのまま残る:過去に誤った設定や不要なデータが残っている可能性がある。

  • 柔軟性が低い:環境をクリーンな状態から構築し直したい場合には適さない。

  • ビルド履歴が複雑化する可能性:継ぎ足しで環境を作り続けると管理が煩雑になる。


2. 新しくビルドする場合

メリット

  • クリーンな環境:Dockerfileから再構築するので、余計なデータやミスを含まない。

  • 再現性が高い:他の人が同じDockerfileを使えば、同じ環境を構築できる。

  • 依存関係の管理がしやすい:必要なものだけを明示的にインストールするので、不要なものが含まれない。

デメリット

  • 時間がかかる:再ビルドには比較的多くの時間がかかる。

  • モデルやデータを再マウントする必要がある:手作業で追加したものは消えるため、再度セットアップが必要。

  • 細かい設定の引き継ぎが手間:前回のコンテナで行った作業内容をDockerfileに反映させる必要がある。

メモ:

name(コンテナ)とtag(イメージファイル)は違うもの。
今回は、イメージファイルのタグをdeepseek-pythonとし、コンテナ名前をperfect_darlingにした。

わたしのdocker設定:
コンテナperfect_darling
イメージ名deepseek_vllm

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