MNISTやってみる!

(39) 共用サーバでPyTorach(順伝播だけ)を実行したい。

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負荷)を注視しておこう。


アクセス数(直近7日): ※試験運用中、BOT除外簡易実装済
  • 2026-06-22: 0回
  • 2026-06-21: 4回
  • 2026-06-20: 0回
  • 2026-06-19: 0回
  • 2026-06-18: 0回
  • 2026-06-17: 0回
  • 2026-06-16: 0回
  • モバイルバージョンを終了