1,020 views
この記事は最終更新から 396日 が経過しています。
【1】やりたいこと
例えば、MNIST自動認識でこんなことをやりたい。
・自宅サーバー上で学習プログラムを実行し、チューニングされた学習済みパラメータセットを作る。
・このデータを使って、共用サーバ上で 数字の自動認識 Webサービス を公開したい。
あくまでも例だ。
こんなものに需要があるはずはない。
このために必要なことは、以下の通り。
・ホームページが設置可能&安価なレンタルサーバ(=共用サーバ)上に PyTorch実行環境を設置したい。
問題点は?
・共用サーバは root権限が与えられていない。
・インストールされているPythonバージョンが古い。
・重たい処理を繰り返すと、ペナルティが与えられたり、最悪の場合はアカウントをBANされてしまう。
これを以下の方法で回避したい。
・非rootでもインストール可能な Anacondaを使い、新しいバージョンの Pythonをインストールする。
・絶対に学習プログラムを動かさない!
・GPUを使わず、CPUのみで実行する。
学習は自宅サーバで実行し、共用サーバ上では処理負荷の軽い順伝播だけを動かす。
【2】やってみる
Step 1/6: Anacondaをインストールする。
こちらからダウンロードする。
※メール登録するとダウンロードリンクが送られてくる。
https://www.anaconda.com/download/
ダウンロードリンクが送られてきたら、インストールしたいマシン上(=共用サーバ上)でダウンロードする。
$ wget https://repo.anaconda.com/archive/Anaconda3-2024.10-1-Linux-x86_64.sh
ダウンロードしたファイルに実行属性を付与し、インストーラを起動する。
$ chmod +x Anaconda3-2024.10-1-Linux-x86_64.sh $ ./Anaconda3-2024.10-1-Linux-x86_64.sh
対話式インストーラが開始されるので、の指示に従って入力する。
このとき、デフォルトのままだと /home/{user}/anaconda3 にインストールされる。
もし、任意のディレクトリに anacondaをインストールしたい場合、以下の個所でディレクトリをフルパス指定する。
下記の場合、インストール先を /opt/anaconda に指定している。
Anaconda3 will now be installed into this location: /home/hoge/anaconda3 - Press ENTER to confirm the location - Press CTRL-C to abort the installation - Or specify a different location below [/home/ana/anaconda3] >>> /opt/anaconda
インストールが完了したら conda init を実行する。
condaのパスが通っていないので、condaが存在する場所まで移動してしまうのが楽だ。
$ cd ~/anaconda3/bin $ conda init
conda initで .bashrc が更新されるので、今の shellでこれを有効化する。
$ source .bashrc
Step 2/6: Anacondaで Python仮想環境を作る。
Anaconda上で PyTorch仮想環境を作成する。
今回は Python3.12を使うことにした。
$ conda create -n pytorch-env python=3.12
Step 3/6: Anacondaで作った Python仮想環境に PyTorchをインストールする。
Anaconda上で作った仮想環境を開始する。
→ プロンプトに (仮想環境名) が表示されるようになった。
$ conda activate pytorch-env
(pytorch-env) $
Anacondaで作った Python仮想環境に PyTorchをインストールする。
※このとき、GPU無しの cpuonly を指定する。
(pytorch-env) $ conda install pytorch torchvision torchaudio cpuonly -c pytorch
PyTorchを動かしてみる。
(pytorch-env) $ python
>>> import torch
>>> device = torch.device(“cuda” if torch.cuda.is_available() else “cpu”)
>>> device
device(type=’cpu’)
>>>
>>> a = torch.rand(10000, 10000, device=device)
>>> b = torch.rand(10000, 10000, device=device)
>>> a+b
tensor([[1.2592, 1.5727, 1.2522, ..., 0.8918, 1.3854, 0.4311],
[1.0928, 1.7651, 1.0456, ..., 0.1744, 0.3453, 1.5659],
[1.0411, 1.6282, 1.3648, ..., 1.4476, 1.6432, 1.7056],
...,
[0.8896, 0.6764, 1.8263, ..., 1.0261, 0.2022, 0.5871],
[1.0192, 0.8412, 1.0861, ..., 0.9996, 1.0850, 1.3208],
[1.2890, 0.8559, 1.4905, ..., 0.5868, 0.9619, 1.1812]])
エラーが出ずに動いた!
OKだ!
Step 4/6: PyTorchを使ったプログラムを実行する。
過去記事 (36)【PyTorchでMNIST #7】自筆画像PNGファイルを自動認識させる。 で使ったプログラムを動作させてみる。
プログラム一式と学習済みパラメータファイルを、共用サーバにアップロードする。FileZillaを使うと便利だ。
$ ll
total 1636
-rw-rw-r-- 1 hoge hoge 1639253 Apr 26 05:16 AAA.pth
drwxrwxr-x 2 hoge hoge 148 Apr 26 05:16 Img
-rw-rw-r-- 1 hoge hoge 1538 Apr 26 05:16 control_test_one_img.py
-rw-rw-r-- 1 hoge hoge 1110 Apr 26 05:16 dataset_MNIST.py
-rw-rw-r-- 1 hoge hoge 1409 Apr 26 05:16 net_model_CNN_01.py
-rw-rw-r-- 1 hoge hoge 2725 Apr 26 05:21 trainer.py
Anaconda上で作った仮想環境を開始する。
→ プロンプトに (仮想環境名) が表示されるようになった。
$ conda activate pytorch-env
(pytorch-env) $
上記の過去記事で作ったプログラムを実行してみる。
(pytorch-env) $ python control_test_one_img.py -p AAA.pth -i ./Img/t_001_2.png
Model loaded from AAA.pth
予測された数字は: 2
各クラスの確率: ['0.0', '0.0', '1.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0']
(pytorch-env) $ python control_test_one_img.py -p AAA.pth -i ./Img/t_006_6.png
Model loaded from AAA.pth
予測された数字は: 6
各クラスの確率: ['0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.8', '0.0', '0.2', '0.0']
自宅サーバでの実行時とまったく同じ結果になった。
OKだ!
Step 5/6: Web経由で PyTorchを実行する。
CGIファイルを作成する。
#!/home/hoge/anaconda3/envs/pytorch-env/bin/python3.12
# -*- coding: utf-8 -*-
import cgi
import torch
print("Content-Type: text/html\n")
print(f"""
<html>
<body>
<h1>Hello from PyTorch!</h1>
<p>PyTorch Version: {torch.__version__}</p>
<p>Random Tensor: {torch.rand(2,3)}</p>
</body>
</html>
""")
このファイルを共用サーバの Webページ公開ディレクトリにアップロードする。
Webサーバ経由で実行できるように、このファイルに実行属性を付与する。
$ chmod +x testcgi.cgi
インターネット経由で、Webブラウザでアクセスしてみる。
https://www.dogrow.net/nnet/sample/00039/webtest.cgi
OKだ!
Step 6/6: Web経由で順伝播を実行する。
ここまでの段階で、Webブラウザ経由で共有サーバ上の PyTorchを実行する環境が出来た。
いよいよ大本命、上記 Step 4/6 のプログラムを Webブラウザから起動したい。
Webサーバ経由で起動した cgiの中で、既存の control_test_one_img.py の中の関数を使って自動認識を実現する。
参考: (36)【PyTorchでMNIST #7】自筆画像PNGファイルを自動認識させる。
#!/home/hoge/anaconda3/envs/pytorch-env/bin/python3.12
# -*- coding: utf-8 -*-
print("Content-Type: text/html; charset=utf-8\n")
path_MNIST = '/home/hoge/MNIST'
import sys
sys.path.append(path_MNIST)
import control_test_one_img
img_path = path_MNIST + '/Img/t_003_8.png'
model_path = path_MNIST + '/AAA.pth'
control_test_one_img.predict_image(img_path, model_path)
この画像を自動認識させてみると・・・
OKだ! 順伝播が正しく動いた。
https://www.dogrow.net/nnet/sample/00039/test1img.cgi
【4】所感
・Webページ経由で、共用サーバ上の PyTorchプログラムを実行できた。
・気になるのは、少々レスポンスが遅いこと・・・
→ 高負荷プログラムの設置を理由に、共用サーバのアカウントが BANされないか心配だ。
管理画面で診断結果(CPU負荷)を注視しておこう。