Dockerを使ってPytorchのsec2secサンプルプログラムを動かすまで(M1 MacbookAir)
はじめに
M1 MacbookでDockerを使いPyTorchが動くようになったので、備忘録です。 まだM1チップに対応していないアプリケーションもあり、今後も同様の方法で動作するかはわからないので、変更があれば修正していきたいと思います。
目次
DockerからPythonの起動
Dockerデスクトップをインストールします。インストール方法は過去記事を参照してください。
※2021/3/26にApple Silicon Tech Previewのアップデートが行われたようです。
次に、Pythonのイメージをインストールします。M1チップに対応するPythonのバージョンは3.9
以降ですので、今回はバージョン3.9.2
のPythonイメージを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に接続できるエディタを使っていない場合、vim
とless
あたりは必要だと思うので導入します。
apt install -y less vim
一通りインストールできたら、pip list
で各モジュールのバージョンを確認しておきましょう。
PyTorchを実行
インストール関係が全て終了したら、公式チュートリアルを動かしてみます。まだ、Dockerに慣れていないので、原始的な方法でファイルを作成します。
mkdir workdir cd workdir touch test.py vim test.py
ソースコードは以下の公式サイトを参照。
実行します。
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のmacbookはpreview版のみに対応しています。 ファイルのダウンロードや最新の情報はこちらから。 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は非常に有効なツールです。 コンテナの技術は奥が深く、まだ発展途上なので、私も勉強をかかさずにしたいと思います。
参考文献
- https://qiita.com/wMETAw/items/34ba5c980e2a38e548db
- https://qiita.com/Sojiro_Otsubo/items/b5323f468a13a55d9439
- https://tech-lab.sios.jp/archives/19191
- https://blauthree.hatenablog.com/entry/2019/07/13/000839
- http://www.tohoho-web.com/docker/dockerfile.html
- https://qiita.com/zaki-lknr/items/db99909ba1eb27803456
- https://docs.microsoft.com/ja-jp/windows/wsl/install-win10
小中学校の計算問題と解答を生成
イントロダクション
たまにはプログラムを書かないと腕がなまりそうなので、簡単なものを作ってみました。 小学校算数や中学校数学の計算問題と解答を作成し、ファイルに出力するプログラムです。
小学算数と中学数学の範囲
各学校ではどのような内容を学ぶのか、文科省のHPで調べ、ざっくりまとめてみました。
まず、小学校
- 四則演算(筆算を含む)
- 表とグラフ
- 平面図形と立体図形
- 分数、小数
- 割合、比例
- その他(魔法陣やパズル)
次に、中学校
- 数と式
- 方程式
- 関数
- 平面図形と立体図形
- 資料の活用
- 証明
四則演算が出来ることが前提で進んでいくので、今回は四則演算(小数、正負の数を含む)の問題生成プログラムを作成していきます。
流れ
今回のプログラムの流れをまとめます。
- 計算設定(問題数の設定等)
- ランダムに問題を生成
- 解答を作成
- 出力
計算設定については、複雑にしすぎると際限なくパターンを考えないといけないので、今回は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']]
今後の展望
方程式、関数、図形問題、証明問題をしたいと思いますが、個人的には文章題の生成と解答がどうにかしてできないか考えてます。 上記の件がうまくいけば、数学だけではなく、理科、国語、社会にも応用していきたいと思います。