snovaのブログ

主にプログラミングやデジタルコンテンツについて書きます。最近はPython, Flutter, VRに興味があります。

Dockerを使ってPytorchのsec2secサンプルプログラムを動かすまで(M1 MacbookAir)

はじめに

M1 MacbookでDockerを使いPyTorchが動くようになったので、備忘録です。 まだM1チップに対応していないアプリケーションもあり、今後も同様の方法で動作するかはわからないので、変更があれば修正していきたいと思います。

目次

DockerからPythonの起動

Dockerデスクトップをインストールします。インストール方法は過去記事を参照してください。

snova301.hatenablog.com

※2021/3/26にApple Silicon Tech Previewのアップデートが行われたようです。

次に、Pythonのイメージをインストールします。M1チップに対応するPythonのバージョンは3.9以降ですので、今回はバージョン3.9.2Pythonイメージをpullしてコンテナをrunさせます。

docker pull python:3.9.2
docker run -i -t --name torchtest python bash

コンテナが無事に起動できたらOK。

root@***:/# python
Python 3.9.2 (default, Mar 12 2021, 14:36:23) 
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> 

PyTorchの導入

先ほど作成したコンテナの中にPyTorchを導入します。今回はPythonイメージからコンテナをrunしていますので、ついでに、numpyなどもインストールします。

pip install --upgrade pip
pip install numpy matplotlib pandas scikit-learn pandas scipy

# pytorch
pip install torch torchvision

テキストの前処理をしてくれるtorchtextは、pip installだと2021/3/27現在でバージョン0.6がインストールされてしまうので、公式Githubから最新バージョンのtorchtextをcloneします。なお、PyTorchのバージョンが1.8だと、torchtextは0.9以上でなければなりません。

apt update
apt upgrade -y
apt install cmake
git clone https://github.com/pytorch/text torchtext
cd torchtext
git submodule update --init --recursive
python setup.py clean install

また、vscodeなどのDockerに接続できるエディタを使っていない場合、vimlessあたりは必要だと思うので導入します。

apt install -y less vim

一通りインストールできたら、pip listで各モジュールのバージョンを確認しておきましょう。

PyTorchを実行

インストール関係が全て終了したら、公式チュートリアルを動かしてみます。まだ、Dockerに慣れていないので、原始的な方法でファイルを作成します。

mkdir workdir
cd workdir
touch test.py
vim test.py

ソースコードは以下の公式サイトを参照。

pytorch.org

実行します。

python test.py

無事に動きました。epoch=1で実行した結果は以下の通り。公式の結果より悪いですが、epoch数を減らしたからだと思います。

| end of epoch   1 | time: 1038.88s | valid loss  5.80 | valid ppl   331.51
-----------------------------------------------------------------------------------------
=========================================================================================
| End of training | test loss  5.72 | test ppl   305.24
=========================================================================================

まとめと今後について

M1 MacbookでPyTorch on Dockerができるようになりました。今後はPyTorchを使って、自然言語処理のプログラムを作成し、共有していきたいと思います。

参考サイト

※いずれも2021/3/27参照

dockerを使ってmacbookとwindowsの開発環境を揃える

はじめに

私の開発環境は5年ほど前からmacbookメインでしたが、1年ほど前にそこそこいいwindows PCを購入したので、2台を併用してプログラム作成に取り掛かっています。

なぜ、1台に統一しないのかというと、

  • macbookは場所を持ち運べるが、windows PCはデスクトップなので持ち運び不可
  • macbookは簡単な計算には最適だが、ヘビーな計算は不可
  • windows PCはそこそこいいCPUとGPUとメモリを積んでいるので、動作は軽快

最近、apple silicon m1のmacbook airに更新しましたが、やはりスペックの問題からヘビーな計算はデスクトップwindows、気軽にプログラムを作るのはmacbookとなってしまい、当面は2台で開発を進める必要があるのかな、と考えてます。

しかし、2台で開発環境を整えるには課題があり、パッケージ追加やアップデートの度に、環境を揃えなければなりません。

そこで、今回は2台の開発環境をできるだけ簡単に揃えるために、dockerを用いて開発環境を構築します。

目次

mac

流れとしては、

  • docker hubのサインアップ
  • Docker Desktop for Macのインストール
  • dockerコンテナの生成起動
  • コンテナの中を操作

docker hubのサインアップとdesktop for macのインストールはこちらから。 https://hub.docker.com/editions/community/docker-ce-desktop-mac

M1のmacbookpreview版のみに対応しています。 ファイルのダウンロードや最新の情報はこちらから。 https://docs.docker.com/docker-for-mac/apple-m1/

コンテナの生成起動方法は、

docker run -it --name [containername] [imagename] bash

最後の、bashの記述がないと、コンテナ実行後すぐにイメージが起動します。 また、dockerコンテナ起動時にイメージがダウンロードされていなかったら、自動でダウンロードされます。

その他、コンテナを動かすために必要なコマンドをまとめます。

役割 コマンド
稼働コンテナ一覧 docker ps -a
コンテナの起動 docker start [option] [containername]
コンテナへの接続 docker attach [containername]
コンテナの削除 docker rm [option] [containername]
ホストコンピュータからコンテナへファイルを渡す docker cp [original filepath] [containername]:/[container filepath]

例えば、ubunt18.04のイメージからhogeというコンテナを生成するし、起動するとき

docker run -it --name hoge ubuntu:18.04 bash
docker start hoge
docker attach hoge

Dockerfileの作成とビルド

dockerfileは設計書のようなものです。 Dockerfileというファイル名の中に、テキストでコンテナの情報を記述していきます。

例えば、ubuntu18.04のイメージからコンテナを起動して、pythonをインストールし、pythontest.pyというファイルをホスト側のカレントディレクトリからイメージ側のhomeディレクトリにコピーするとき、

FROM ubuntu:18.04

RUN apt-get update
RUN apt-get install -y python3 python3-pip

ADD pythontest.py home/pythontest.py

ファイルを作成したら、Dockerfileをbuildしてイメージを生成します。

docker build -t [imagename] [Dockerfileのファイルパス]

カレントディレクトリにDockerfileがあるなら、

docker build -t imhoge .

ちなみに、[imagename]はすべて小文字でないと、怒られます。

終了したら、docker images -aでイメージが作成されているか確認し、イメージが作成されていたら、runさせコンテナを生成します。

windows

流れとしては、

  • docker hubのサインアップ
  • Docker Desktop for windowsのインストール
  • dockerコンテナの生成起動
  • コンテナの中を操作

ここでは、Docker Desktop for windowsの導入をおこないます。

私の環境はwindows10 Homeだったので、ちょっと前まではDockerの導入ができませんでしたが、最近はHomeでも簡単にDockerを導入できるようになったので、導入することにしました。

方法は簡単で、公式ダウンロードページから、アプリケーションをダウンロードし、手順に乗っ取りインストールを進めます。 途中、WSL2に関するインストールが求められるので、MS公式サイトを参考に、WSL2をインストールします。

WSL2を立ち上げることができたら、Docker Desktopも起動可能となリ、Dockerを起動できれば、Dockerfileから開発環境を揃えることができます。

まとめ

環境を揃えるためには、Dockerは非常に有効なツールです。 コンテナの技術は奥が深く、まだ発展途上なので、私も勉強をかかさずにしたいと思います。

参考文献

小中学校の計算問題と解答を生成

イントロダクション

たまにはプログラムを書かないと腕がなまりそうなので、簡単なものを作ってみました。 小学校算数や中学校数学の計算問題と解答を作成し、ファイルに出力するプログラムです。

小学算数と中学数学の範囲

各学校ではどのような内容を学ぶのか、文科省のHPで調べ、ざっくりまとめてみました。

まず、小学校

  • 四則演算(筆算を含む)
  • 表とグラフ
  • 平面図形と立体図形
  • 分数、小数
  • 割合、比例
  • その他(魔法陣やパズル)

次に、中学校

  • 数と式
  • 方程式
  • 関数
  • 平面図形と立体図形
  • 資料の活用
  • 証明

四則演算が出来ることが前提で進んでいくので、今回は四則演算(小数、正負の数を含む)の問題生成プログラムを作成していきます。

流れ

今回のプログラムの流れをまとめます。

  1. 計算設定(問題数の設定等)
  2. ランダムに問題を生成
  3. 解答を作成
  4. 出力

計算設定については、複雑にしすぎると際限なくパターンを考えないといけないので、今回は4つだけにしました。 - 問題数 - 問題の桁数 - 負の数を含めるか - 小数を含めるか

また、出力形式はTSVにしました。 (csvだと小数ありのとき読みにくかったので)

実際のプログラム

コメントも記載したプログラムです。

四則演算問題生成

githubでも共有します。

https://github.com/snova301/math_ope4_gen

結果

add
 [['6' '+' '5' '=' '11']
 ['3' '+' '5' '=' '8']
 ['6' '+' '7' '=' '13']
 ['6' '+' '7' '=' '13']
 ['6' '+' '5' '=' '11']
 ['6' '+' '4' '=' '10']
 ['8' '+' '8' '=' '16']
 ['1' '+' '5' '=' '6']
 ['7' '+' '4' '=' '11']
 ['8' '+' '8' '=' '16']]

diff
 [['6' '-' '2' '=' '4']
 ['4' '-' '4' '=' '0']
 ['4' '-' '4' '=' '0']
 ['8' '-' '3' '=' '5']
 ['8' '-' '6' '=' '2']
 ['8' '-' '7' '=' '1']
 ['5' '-' '3' '=' '2']
 ['7' '-' '4' '=' '3']
 ['7' '-' '2' '=' '5']
 ['6' '-' '2' '=' '4']]

multiply
 [['2' '*' '1' '=' '2']
 ['8' '*' '4' '=' '32']
 ['8' '*' '4' '=' '32']
 ['1' '*' '2' '=' '2']
 ['4' '*' '4' '=' '16']
 ['7' '*' '3' '=' '21']
 ['2' '*' '2' '=' '4']
 ['1' '*' '1' '=' '1']
 ['4' '*' '6' '=' '24']
 ['4' '*' '8' '=' '32']]

 div
 [['4' '/' '4' '=' '1.0']
 ['5' '/' '5' '=' '1.0']
 ['5' '/' '2' '=' '2.5']
 ['4' '/' '4' '=' '1.0']
 ['4' '/' '7' '=' '0.5714285714285714']
 ['3' '/' '3' '=' '1.0']
 ['6' '/' '1' '=' '6.0']
 ['2' '/' '6' '=' '0.3333333333333333']
 ['6' '/' '8' '=' '0.75']
 ['7' '/' '6' '=' '1.1666666666666667']]

今後の展望

方程式、関数、図形問題、証明問題をしたいと思いますが、個人的には文章題の生成と解答がどうにかしてできないか考えてます。 上記の件がうまくいけば、数学だけではなく、理科、国語、社会にも応用していきたいと思います。

Google Play and the Google Play logo are trademarks of Google LLC.