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

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

⑫ Anaconda、Keras、TensorFlow

Anacondaは今回を機にクローズし、開発実績のあるMNISTモデルのみ最小構成のvenvでレガシーシステムとして残すことにした。 Keras 3への世代交代という大きな壁にぶつかりながらも、コード改修は最小限に抑える方法を見つけた回。

作業端末: 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

01Anacondaをクローズする判断

旧サーバーのAnaconda環境(alpha-userユーザー、Python 3.13)は、MNISTモデル1件のみの開発実績で、今後の新規開発予定もない。 MNIST体験システム自体は、ブラウザ(WebSocket/Ajax)→ wsgiアプリ(Mosquitto連携)という構成の実験でもあり、 word2vecシステムの発展形、そしてRAGシステム(WebSocket-RabbitMQ連携)のお手本でもあったため、レガシーシステムとして残す価値はある。

そこでAnaconda全体を持ち込むのではなく、必要最低限の素のvenv(/home/login-user/env3.13)として再構築する方針にした。

02Python 3.13の入手でひと手間

③で使ったバックポートPPA(canonical-python-maintainers/python-backports)で3.12は問題なく入ったが、 今回3.13を試すとUnable to locate package python3.13。apt update後も見つからず、このPPAのラインナップに3.13が含まれていないと判断した。

login-user@新サーバー
$ sudo add-apt-repository ppa:deadsnakes/ppa $ sudo apt update $ sudo apt install python3.13 python3.13-venv python3.13-dev

長年実績のあるDeadsnakes PPAに切り替えて解決。

03Keras 3への世代交代という壁

MNISTコンシューマーのコードはimport kerasやfrom keras.preprocessing.image import img_to_array, load_imgという、2023年以前の書き方だった。 現在素のkerasパッケージをインストールすると、これとはAPIが大きく異なるKeras 3が入ってしまい、 keras.preprocessing.imageモジュール自体が廃止されているため、無改修では動かない。

対応:tf-keras + 環境変数でKeras 2を継続利用 TensorFlow開発チームが提供するtf-kerasパッケージ(Keras 2をそのまま独立パッケージとして継続提供)を使い、 環境変数TF_USE_LEGACY_KERAS=1を設定することで、import kerasが透過的にKeras 2として振る舞うようになる。 コードの書き換えなしで済ませる、公式に用意された移行パスだった。
login-user@新サーバー
$ python3.13 -m venv /home/login-user/env3.13 $ source /home/login-user/env3.13/bin/activate $ pip install tensorflow tf-keras pillow paho-mqtt
MNISTコンシューマースクリプト冒頭
import os os.environ["TF_USE_LEGACY_KERAS"] = "1"

確認用に以下を実行し、Keras 2系のバージョン表示とkeras.preprocessing.imageのimport成功を確認した。

login-user@新サーバー
$ python3 -c "import os; os.environ['TF_USE_LEGACY_KERAS']='1'; import keras; print(keras.__version__); from keras.preprocessing.image import img_to_array; print('OK')"

04load_imgの引数仕様が変わっていた

推論テスト実行時にValueError: color_mode must be "grayscale", "rgb", or "rgba"が発生。 tf-keras自体は保守されているバージョンのため、load_imgの第2引数が古い真偽値のgrayscaleから、文字列のcolor_modeへ置き換わった変更までは遡って再現されなかった。

MNISTコンシューマー(修正)
# 修正前 img_load = load_img('example.jpg', False, target_size=(img_width, img_height)) # 修正後 img_load = load_img('example.jpg', target_size=(img_width, img_height))

元のFalse(グレースケールにしない=カラーで読む)は、color_modeの既定値"rgb"と意味が一致するため、単純に引数を削除するだけで済んだ。

05推論テスト成功

login-user@新サーバー
$ python3 mnist2.py [4] [[1.15e-05, 7.73e-04, 1.00e-05, 2.88e-06, 0.6835, 1.43e-05, 0.2430, 0.0070, 0.0656, 7.77e-05]]
確認完了 最も確率の高いクラスは4(0.68)、次点で6(0.24)というもっともらしい結果。学習済み.h5モデルの読み込み・推論とも正常に動作した。

Mosquittoが未導入のため、MQTT経由の本番相当の起動確認は⑮以降に持ち越し。

06ここまでの状態

  • Anaconda環境は新サーバーへ持ち込まず終了。MNISTモデルのみ/home/login-user/env3.13の最小構成venvで継続
  • Deadsnakes PPAでPython 3.13を導入
  • tf-keras+TF_USE_LEGACY_KERAS=1で、Keras 3への強制移行を回避しつつ現行TensorFlowを利用
  • load_imgの廃止引数への対応で1行修正、推論テスト成功
← 前回: ⑪ llama.cpp、ChromaDB 次回: ⑬ Node.js →

『ConoHa VPS移設記 ⑫ Anaconda、Keras、TensorFlow』を公開しました。