A certain engineer "COMPLEX"

開発メモ その174 WindowsコンテナとLinuxコンテナを共存させる

Introduction


前回はシステムで利用するコンテナをWindowsからLinuxコンテナ、その逆と切り替えてみました。

How to


まずWindowsコンテナに切り替えます。
そしてExperimentalを有効化します。

Linux イメージを動かしてみる

alpineコンテナが動いています。
ホストのディレクトリもマウントできています。


> docker version
Client: Docker Engine - Community
Version: 18.09.2
API version: 1.39
Go version: go1.10.8
Git commit: 6247962
Built: Sun Feb 10 04:12:31 2019
OS/Arch: windows/amd64
Experimental: false

Server: Docker Engine - Community
Engine:
Version: 18.09.2
API version: 1.39 (minimum version 1.24)
Go version: go1.10.6
Git commit: 6247962
Built: Sun Feb 10 04:28:48 2019
OS/Arch: windows/amd64
Experimental: true
> docker run --rm -v c:/Users:/data alpine ls /data
All Users
Default
Default User
DefaultAppPool
Public
TAKUYA
desktop.ini

Windowsイメージ

Windows Server Corealpineが表示されています。


>docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nvidia/cuda 10.0-cudnn7-devel-ubuntu16.04 c963dc0723b7 8 days ago 3.17GB
nvidia/cuda 9.2-cudnn7-devel-ubuntu16.04 fa48202870f2 8 days ago 3.09GB
mcr.microsoft.com/windows/servercore 1809-amd64 43c05724e30b 2 weeks ago 4.56GB
ubuntu 16.04 2a697363a870 3 weeks ago 134MB
alpine latest 055936d39205 4 weeks ago 6.28MB

まとめ

Windowsコンテナに切り替えればイメージを共存されることができました。
ドライブの共有も問題なしです。

開発メモ その173 WindowsコンテナとLinuxコンテナを切り替える

Introduction


Docker for Windowsでコンテナを切り替えてみました。
環境はこんな感じです。

How to


特に難しいことはありません。
タスクトレイのSwitch to Windows containers...をクリックするだけです。

Linux から Windows へ

切り替えた直後です。
イメージが消えています。ちょっと驚きます。


>docker version
Client: Docker Engine - Community
Version: 18.09.2
API version: 1.39
Go version: go1.10.8
Git commit: 6247962
Built: Sun Feb 10 04:12:31 2019
OS/Arch: windows/amd64
Experimental: false

Server: Docker Engine - Community
Engine:
Version: 18.09.2
API version: 1.39 (minimum version 1.24)
Go version: go1.10.6
Git commit: 6247962
Built: Sun Feb 10 04:28:48 2019
OS/Arch: windows/amd64
Experimental: false

C:\Users\TAKUYA>docker images
REPOSITORY TAG IMAGE ID CREATED SIZE

Windows から Linux へ

戻してみます。
イメージが戻っています。


>docker version
Client: Docker Engine - Community
Version: 18.09.2
API version: 1.39
Go version: go1.10.8
Git commit: 6247962
Built: Sun Feb 10 04:12:31 2019
OS/Arch: windows/amd64
Experimental: false

Server: Docker Engine - Community
Engine:
Version: 18.09.2
API version: 1.39 (minimum version 1.12)
Go version: go1.10.6
Git commit: 6247962
Built: Sun Feb 10 04:13:06 2019
OS/Arch: linux/amd64
Experimental: true

C:\Users\TAKUYA>docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mcr.microsoft.com/dotnet/core/sdk 2.1-bionic 28d5b1e8a03b 2 weeks ago 1.7GB
mcr.microsoft.com/dotnet/core/runtime 2.1-bionic 51c475cc6ed8 2 weeks ago 194MB
ubuntu latest 7698f282e524 3 weeks ago 69.9MB
nvidia/cuda 10.0-cudnn7-devel-centos6 1d245213a2c9 2 months ago 2.88GB
nvidia/cuda 10.0-cudnn7-devel-ubuntu16.04 e1d637677e0d 2 months ago 3.08GB
centos 7 9f38484d220f 2 months ago 202MB
ubuntu 16.04 7e87e2b3bf7a 4 months ago 117MB
ubuntu 14.04 5dbc3f318ea5 4 months ago 188MB
ubuntu 18.04 20bb25d32758 4 months ago 87.5MB
alpine edge dacde26455ab 5 months ago 5.28MB
alpine latest 3f53bb00af94 5 months ago 4.41MB
nvidia/cuda 9.2-cudnn7-devel-ubuntu16.04 7affc4c2ce61 6 months ago 2.9GB
nvidia/cuda 9.2-cudnn7-devel-centos6 b26377b9a39a 7 months ago 2.82GB
docker4w/nsenter-dockerd latest 2f1c802f322f 7 months ago 187kB
centos 6.10 30e66b619e9f 8 months ago 194MB

まとめ

イメージを共存することはできませんが、切り替えたからと言って前の環境に戻せなくなる、ということはありません。

開発メモ その172 Synology GitLabでLFSを使ってみる

Introduction


自宅のNASでGitLabをDockerで運用していますが、LFSを有効にするのに苦労したのでメモ。

How to


URL変更

Dockerの環境変数でGITLAB_HOSTを変更します。
既定ではlocalhostになっているので変更します。

HTTPS有効

これは私の環境では有効だったのでスキップ。
ただ、Dockerの環境変数でGITLAB_PORTに対応するGitLabのポートが80のため、ここを443に変更します。

プロジェクトでLFSを有効

General SettingsPermissionsからGit Large File Storageを有効にします。
これは各プロジェクトで有効にします。

クローン&プッシュ


git clone https://hogehoge.com/data/test.git
cd test
git lfs install
git lfs track *.jpg
git add *.jpg
git add .gitattributes
git commit -m "initial commit"
git config --add lfs.url "https://hogehoge.com/data/test.git/info/lfs/"
git config lfs.contenttype false
git push origin master

git config lfs.contenttype falseがミソです。
これは

### Summary Cannot push to a large repository (around ~3800 files, totalling ~1.6GB) with Git LFS. ### Steps to reproduce 1. Start a new Docker GitLab CE (wi...

に書いてありました。

開発メモ その171 ChainerのモデルデータをONNXに変換してみる

Introduction


ChainerはPythonで動きます。
学習はPythonで良くてもシステムに組み込む際にPythonは聊か都合が悪いです。
なので、学習結果であるモデルファイルをPython以外の言語で扱えるように、共通データフォーマットであるONNX (Open Neural Network Exchange)に変換してみます。

How to


シンプルなMNISTのサンプルで生成されるモデルファイルを変換してみます。
まずはChainerの環境を構築。Windows上の仮想環境を想定。

環境構築

Introduction以前、CUDAを含むChainerのインストール手法を書きましたが、もう少しわかりやすく整理しました。ResolutionCUDA_PATHの確認Chainerで利用するCUDAを確認し...

を参考にし、下記のコマンドを実行します。


> python -m pip install --upgrade pip
> python -m pip install cupy==5.3.0
> python -m pip install cupy-cuda92==5.3.0
> python -m pip install chainer==5.3.0
> python -m pip install onnx-chainer

インストール後はCUDAを認識しているかを確認します。


> python -c "import chainer; chainer.print_runtime_info()"
Platform: Windows-10-10.0.17763-SP0
Chainer: 5.3.0
NumPy: 1.16.2
CuPy:
CuPy Version : 5.3.0
CUDA Root : C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.2
CUDA Build Version : 9020
CUDA Driver Version : 10000
CUDA Runtime Version : 9020
cuDNN Build Version : 7402
cuDNN Version : 7402
NCCL Build Version : None
NCCL Runtime Version : None
iDeep: Not Available

学習と変換

ソースをクローンし、train_mnist.pyを修正します。


> git clone https://github.com/chainer/chainer
> cd chainer
> git checkout v5.3.0
> cd examples\mnist

修正前はモデルファイルを出力しないためです。
修正は下記2箇所。

箇所1


#!/usr/bin/env python
import argparse

import chainer
import chainer.functions as F
import chainer.links as L
from chainer import training
from chainer.training import extensions

+ import os
+ from chainer import serializers
+ import onnx_chainer
+ import cupy as xp

箇所2


if args.resume:
# Resume from a snapshot
chainer.serializers.load_npz(args.resume, trainer)

# Run the training
trainer.run()

+ model_file = os.path.join(args.out, 'mnist.model')
+ onnx_file = os.path.join(args.out, 'mnist.onnx')
+ serializers.save_npz(model_file, model)
+ chainer.config.train = False
+ # ダミーデータ
+ x = xp.zeros((1, 1, 28, 28), dtype=xp.float32)
+ onnx_chainer.export(model.predictor, x, filename=onnx_file)

if __name__ == '__main__':
main()

下記を実行します。


> python train_mnist.py --gpu 0
GPU: 0
# unit: 1000
# Minibatch-size: 100
# epoch: 20

Downloading from http://yann.lecun.com/exdb/mnist/train-images-idx3-ubyte.gz...
Downloading from http://yann.lecun.com/exdb/mnist/train-labels-idx1-ubyte.gz...
Downloading from http://yann.lecun.com/exdb/mnist/t10k-images-idx3-ubyte.gz...
Downloading from http://yann.lecun.com/exdb/mnist/t10k-labels-idx1-ubyte.gz...
D:\Works\Python\envs\Chainer_5.3.0\lib\site-packages\chainer\training\extensions\plot_report.py:25: UserWarning: matplotlib is not installed on your environment, so nothing will be plotted at this time. Please install matplotlib to plot figures.

$ pip install matplotlib

warnings.warn('matplotlib is not installed on your environment, '
epoch main/loss validation/main/loss main/accuracy validation/main/accuracy elapsed_time
1 0.189437 0.0972368 0.94235 0.9701 8.70826
2 0.0736203 0.0654 0.977182 0.9789 11.5016
3 0.0483072 0.0657967 0.984433 0.9786 13.9685
4 0.0344889 0.0775722 0.988614 0.9779 16.4064
5 0.0307565 0.073484 0.990132 0.9808 18.8182
6 0.0247791 0.0676734 0.991932 0.981 21.2477
7 0.0187978 0.0756141 0.993648 0.9822 23.7888
8 0.0151227 0.0729054 0.994965 0.9836 26.2349
9 0.0162507 0.09349 0.994649 0.9805 28.6772
10 0.0186082 0.07771 0.994565 0.983 31.1291
11 0.0121478 0.0878187 0.996282 0.9829 33.575
12 0.0139532 0.103692 0.995515 0.9803 36.1334
13 0.0128902 0.0869704 0.996015 0.9812 38.5139
14 0.00887171 0.0960986 0.997182 0.9807 40.966
15 0.00950978 0.0941747 0.997016 0.9835 43.492
16 0.0117687 0.112775 0.996632 0.9805 45.8972
17 0.012322 0.109815 0.996782 0.9803 48.2932
18 0.00880352 0.10031 0.997383 0.9818 50.731
19 0.00929279 0.118552 0.997365 0.979 53.3326
20 0.00607901 0.0849677 0.99825 0.9852 55.8271

学習の結果、result\mnist.modelresult\mnist.onnxが出力されています。

開発メモ その170 M2DetをUbuntu18.04で使ってみる(学習編)

Introduction


前回の続き。
今回は学習を行ってみます。

How to


公式によると下記のコマンドで学習できるとのこと。


python train.py -c=configs/m2det512_vgg.py --ngpu 4 -t True

しかしこのコマンドはTensorBoradを使った学習になります。
つまりTensorFlowが必要になります。
必要ない場合は


python train.py -c=configs/m2det512_vgg.py --ngpu 4

でOK。
--npgu引数は利用するGPUの数。4個をサンプルとして表記しておくあたり、どれだけリソースを使うのか、とビクビクします。

モデルファイル

まず、pretrainedモデルをダウンロードします。
これは前回ダウンロードしたものとは異なります。
公式リンクにも書いておらず、ファイル名から検索をかけた結果、下記のページにリンクが書いてありました。

A PyTorch Implementation of Single Shot MultiBox Detector - amdegroot/ssd.pytorch


wget https://s3.amazonaws.com/amdegroot-models/vgg16_reducedfc.pth
mkdir weights
mv vgg16_reducedfc.pth weights

データセット

データセットをダウンロードします。しかし、これも公式には書いていません。
上述のssd.pytorchでスクリプトが用意されています。


git clone https://github.com/amdegroot/ssd.pytorch

そして、このリポジトリにある下記のスクリプトからデータセットをダウンロードします。

  • COCO
    • ./data/scripts/COCO2014.sh
    • ~/data にダウンロードされる
  • VOC2007
    • ./data/scripts/VOC2007.sh
    • ~/data にダウンロードされる
  • VOC2012
    • ./data/scripts/VOC2012.sh
    • ~/data にダウンロードされる

必要に応じてシンボリックリンクで退避するなど工夫する


ln -s /media/hdd/work/data ~/data

ダウンロード完了後、

  • COCO
    • ~/data/coco/annotations/annotations の中身を ** ~/data/coco/annotations** に移動 その場所に展開
    • ~/data/coco/images/train2014~/data/coco/images/val2014が存在することを確認
    • wget https://github.com/insikk/coco_dataset_trainval35k/blob/master/instances_valminusminival2014.json.zip?raw=true -O instances_valminusminival2014.json.zip
    • =/data/cocoで実行、展開、annotationsへ移動

し、data/coco.pyを下記のように変更します。


def __init__(self, root, image_sets, preproc=None, target_transform=None,
dataset_name='COCO'):
self.root = root
self.data_path = os.path.join(os.path.expanduser("~"),'data')
- self.cache_path = os.path.join(self.data_path, 'coco_cache')
+ self.cache_path = os.path.join(self.data_path, 'coco')
self.image_set = image_sets

そして前述の学習コマンドを実行します。


python train.py -c=configs/m2det512_vgg.py --ngpu 1

がいろいろエラーが。

エラー1

data/coco.py を直していない時のエラー


creating index...
index created!
Traceback (most recent call last):
File "train.py", line 58, in
dataset = get_dataloader(cfg, args.dataset, 'train_sets')
File "/media/hdd/work/local/M2Det/utils/core.py", line 93, in get_dataloader
getattr(cfg.dataset, dataset)[setname], _preproc)
File "/media/hdd/work/local/M2Det/data/coco.py", line 65, in __init__
self.annotations.extend(self._load_coco_annotations(coco_name, indexes,_COCO))
File "/media/hdd/work/local/M2Det/data/coco.py", line 101, in _load_coco_annotations
with open(cache_file, 'wb') as fid:
FileNotFoundError: [Errno 2] No such file or directory: '/home/takuya/data/coco_cache/train2014_gt_roidb.pkl'

エラー2

バッチサイズが大きすぎる。
configs/m2det512_vgg.pyper_batch_size を小さくする


===> Training M2Det on COCO
Traceback (most recent call last):
File "train.py", line 86, in
out = net(images)
File "/media/hdd/Ubuntu18.04/python/M2Det/lib/python3.6/site-packages/torch/nn/modules/module.py", line 477, in __call__
result = self.forward(*input, **kwargs)
File "/media/hdd/work/local/M2Det/m2det.py", line 106, in forward
x = self.base[k](x)
File "/media/hdd/Ubuntu18.04/python/M2Det/lib/python3.6/site-packages/torch/nn/modules/module.py", line 477, in __call__
result = self.forward(*input, **kwargs)
File "/media/hdd/Ubuntu18.04/python/M2Det/lib/python3.6/site-packages/torch/nn/modules/conv.py", line 301, in forward
self.padding, self.dilation, self.groups)
RuntimeError: CUDA error: out of memory

これらを超えて学習が始まりましたが、まったく終わりません。
COCOのデータの画像数が多いのもありますが、1080だとバッチサイズ4が限界で、1epoch回すのに6hかかりました。
なので学習は断念しました。