スマートフォン・タブレットからインターネットサーバーオペレーション

APPW.jp
 
ConoHa VPS移設記/2GB・3コア → 4GB・4コア/Ubuntu 26.04 LTS

⑩ Python

「3.14に1本化したい」という当初の希望から出発し、mod_wsgiのバージョン制約、gensimの3.12依存、 GPUなしVPSにCUDAパッケージが紛れ込む問題まで、環境構成をゼロから見直した回。

作業端末: iPad mini(Termius)

MIGRATION ROADMAP — 全17工程
  1. ① SSH、ユーザー追加
  2. ② IPv4/IPv6追加、netplan、ufw
  3. ③ Apache2
  4. ④ Let's Encrypt
  5. ⑤ PHP
  6. ⑥ MariaDB
  7. ⑦ WordPress
  8. ⑧ Dovecot、Postfix
  9. ⑨ Vsftpd
  10. ⑩ Python
  11. ⑪ llama.cpp、ChromaDB
  12. ⑫ Anaconda、Keras、TensorFlow
  13. ⑬ Node.js
  14. ⑭ MongoDB
  15. ⑮ Mosquitto
  16. ⑯ RabbitMQ
  17. ⑰ Supervisor

01旧サーバーの3環境を棚卸し

バージョン実体ユーザー用途
3.12venvlogin-userword2vec、wsgiアプリ全般
3.13Anacondaalpha-userMNISTモデル
3.14venvlogin-userその他ツール一式(RAG関連含む)

3.14への1本化を目指したが、word2vecが使うgensimが3.14未対応(3.12まで)という制約があり、単純な1本化はできなかった。

02アーキテクチャの再確認:wsgiアプリは「薄いクライアント」

③⑤で確認したmod_wsgiの設定は、MNIST・word2vecどちらも実体は次のような構造だった。

  • MNIST:ブラウザ(WebSocket、代替でAjax)→ wsgiアプリ(WebSocketクライアント)→ WebSocketサーバー(RabbitMQプロデューサー)→ MNISTモデル(RabbitMQコンシューマー、Anaconda/alpha-user/3.13)
  • word2vec:ブラウザ(Ajax)→ wsgiアプリ(MQTTクライアント)→ Mosquitto → gensimコンシューマー(login-user/3.12)

つまりどちらのwsgiアプリも、実際の計算処理(TensorFlow・gensim)を直接importしているわけではなく、メッセージキュー越しに投げるだけの薄いクライアントだった。

mod_wsgiの制約(③で確認済み) mod_wsgi.soは特定のPythonバージョンに静的リンクされるため、1つのApacheプロセスで使えるPythonバージョンは1つだけ。wsgiアプリ側にgensim等の直接依存がないと分かったことで、両方のwsgiアプリを3.14に統一できるという結論になった。

03最終構成

環境用途
/home/login-user/env-wsgi(3.14)mod_wsgi本体、MNIST・word2vec両方のwsgiアプリ
/home/login-user/env-gensim(3.12)gensimコンシューマー専用(MQTT経由でword2vec処理のみ)
/home/login-user/env3.14汎用ツール一式(RAG関連、地図・GPS処理等)
3.13保留。⑫でAnaconda継続かvenv移行か決めてから着手

04gensimコンシューマー用(3.12)

旧サーバーの3.12環境は62パッケージあったが、開発時に使って現在は不要なものが混在していた。実際にコンシューマースクリプトがimportしているのは3つだけだった。

word2vecコンシューマー(import部分)
import json from gensim.models import KeyedVectors import sys import paho.mqtt.client as mqtt from datetime import datetime
login-user@新サーバー
$ python3.12 -m venv /home/login-user/env-gensim $ source /home/login-user/env-gensim/bin/activate $ pip install gensim==4.4.0 paho-mqtt==2.1.0 $ deactivate

(json・sys・datetimeは標準ライブラリ、numpy・scipy・smart_openはgensimの依存関係として自動的に入る)

05mod_wsgiを3.14でビルドし直し

⑤の時点ではmod_wsgi・wsgiアプリともに3.12前提で組んでいたが、今回の整理で3.14へ統一する方針になったため、mod_wsgiのビルドをやり直した。

login-user@新サーバー
$ sudo apt install python3.14-venv python3.14-dev $ python3.14 -m venv /home/login-user/env-wsgi $ source /home/login-user/env-wsgi/bin/activate $ pip install mod_wsgi $ mod_wsgi-express module-config

出力されたLoadModule・WSGIPythonHomeを⑤で作成した/etc/apache2/mods-available/wsgi.load・wsgi.confへ上書き。 MNIST・word2vecそれぞれのVirtualHost内、WSGIDaemonProcessのpython-home=/home/login-user/env3.12も/home/login-user/env-wsgiへ修正が必要(word2vecアプリ自体はMQTT経由の薄いクライアントなので3.14環境で問題なく動く)。

login-user@新サーバー
$ sudo systemctl restart apache2

06汎用ツール環境(3.14)とCUDAパッケージの罠

旧サーバーの3.14環境のpip freezeを見ると、torchの依存関係としてnvidia-*・cuda-*・tritonが大量に含まれていた。 このVPSはCPU専用(GPUなし)で、これらは一切使われないままディスク容量だけを消費する(合計数GB規模になることもある)。 4GB RAMという制約の中、無駄な容量は避けたいので除外した。

login-user@新サーバー
$ sudo apt install python3.14-venv $ python3.14 -m venv /home/login-user/env3.14 $ source /home/login-user/env3.14/bin/activate $ pip install torch==2.11.0 --index-url https://download.pytorch.org/whl/cpu # CPU専用ビルドを先に入れることでnvidia-*/cuda-*が入らない $ pip install (torch以外の全パッケージ、旧freezeのバージョン指定通り) $ deactivate
確認 pip list | grep -i nvidiaで何も出ないことを確認。llama_cpp_python、chromadb、torch、transformers等のRAG関連パッケージを含め、インストール完了。

07ここまでの状態

  • mod_wsgi・両wsgiアプリを3.14へ統一、gensimコンシューマーのみ3.12の独立venvに分離
  • gensim用venvは実際にimportされている3パッケージのみで最小構成に
  • 汎用ツール用3.14venvは、GPU専用パッケージを除外してCPU専用ビルドで構築
  • 3.13・Anacondaの扱いは⑫へ持ち越し
← 前回: ⑨ Vsftpd 次回: ⑪ llama.cpp、ChromaDB →

『ConoHa VPS移設記 ⑩ Python』を公開しました。