- ① SSH、ユーザー追加
- ② IPv4/IPv6追加、netplan、ufw
- ③ Apache2
- ④ Let's Encrypt
- ⑤ PHP
- ⑥ MariaDB
- ⑦ WordPress
- ⑧ Dovecot、Postfix
- ⑨ Vsftpd
- ⑩ Python
- ⑪ llama.cpp、ChromaDB
- ⑫ Anaconda、Keras、TensorFlow
- ⑬ Node.js
- ⑭ MongoDB
- ⑮ Mosquitto
- ⑯ RabbitMQ
- ⑰ 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が含まれていないと判断した。
長年実績のある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をそのまま独立パッケージとして継続提供)を使い、
環境変数TF_USE_LEGACY_KERAS=1を設定することで、import kerasが透過的にKeras 2として振る舞うようになる。
コードの書き換えなしで済ませる、公式に用意された移行パスだった。
確認用に以下を実行し、Keras 2系のバージョン表示とkeras.preprocessing.imageのimport成功を確認した。
04load_imgの引数仕様が変わっていた
推論テスト実行時にValueError: color_mode must be "grayscale", "rgb", or "rgba"が発生。
tf-keras自体は保守されているバージョンのため、load_imgの第2引数が古い真偽値のgrayscaleから、文字列のcolor_modeへ置き換わった変更までは遡って再現されなかった。
元のFalse(グレースケールにしない=カラーで読む)は、color_modeの既定値"rgb"と意味が一致するため、単純に引数を削除するだけで済んだ。
05推論テスト成功
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行修正、推論テスト成功