かれ4

かれこれ4個目のブログ

BrainScriptのデバッグ環境をDockerとmakeで整える

f:id:tottokug:20170302003757p:plain

MacではCognitive Toolkit (Microsoft Cognitive Toolkit) (以下 cntk) をインストールすることが面倒だった。。。。

Intel MKL をMacにインストールするが大変なので、 以前からDockerを使ってcntkを動かすことにしていた

blog.tottokug.com

Dockerでcntkのコンテナを立ち上げておけば、そのコンテナ内で実行したりBrainScriptを編集する事は出来るけど、なんかいまいち効率が悪い気がする。

手元の環境でBrainScriptを編集して、 Containerで実行みたいな手軽にテストしていける環境が欲しかった。

普段はVisual Studio CodeでBrainScriptを書くことがおおいので、できればその中で完結させたかった。

そこで、Makefileでいい感じにBrainScript用とデータ用のVolume Containerを作り、データやBrainScriptのファイルをいれておき、 cntk実行用のContainerに2つのVolume Containerをマウントした状態で起動するというMakefileを作ってみた。

# cntkのdocker image
DOCKER_IMAGE := microsoft/cntk:1.7.2-runtime-cpu
# brainscriptをどこに置くか
SCRIPT_MOUNT_POINT := /var/cntk/scripts
# dataをどこに置くか
DATA_MOUNT_POINT := /var/cntk/data
# brainscript入りのVolume containerの名前、別で使っているところと衝突しないように
SCRIPT_VOLUME_CONTAINER := CNTKbrainscript000000
# data入りのVolume containerの名前、別で使っているところと衝突しないように
DATA_VOLUME_CONTAINER := CNTKdata000000

# brainscript directory
BS_DIR := $(CURDIR)/scripts
# data directory
DATA_DIR := $(CURDIR)/data

all: scriptvc 
  docker run --rm     --volumes-from ${SCRIPT_VOLUME_CONTAINER} --volumes-from ${DATA_VOLUME_CONTAINER} ${DOCKER_IMAGE} cntk configFile=${SCRIPT_MOUNT_POINT}/branddetect.cntk

shell: scriptvc
  docker run --rm -it --volumes-from ${SCRIPT_VOLUME_CONTAINER} --volumes-from ${DATA_VOLUME_CONTAINER} ${DOCKER_IMAGE} /bin/bash

scriptvc: datavc
  $(eval SCRIPT_VOLUME_EXISTS := $(shell docker ps -a --format={{.Names}} --filter=name=${SCRIPT_VOLUME_CONTAINER} | wc -l |awk '{print $1}'))
ifeq ($(SCRIPT_VOLUME_EXISTS),0)
   @echo "#========# create scripts volume #========#"
    docker create -v ${SCRIPT_MOUNT_POINT} --name ${SCRIPT_VOLUME_CONTAINER} busybox
else
   @echo "#========# already exists script volume #========#"
endif
    docker cp ${BS_DIR}/ ${SCRIPT_VOLUME_CONTAINER}:${SCRIPT_MOUNT_POINT}/

datavc:
  $(eval DATA_VOLUME_EXISTS := $(shell docker ps -a --format={{.Names}} --filter=name=$(DATA_VOLUME_CONTAINER) |wc -l |awk '{print $1}' ))
  $(info $(DATA_VOLUME_CONTAINER))
  $(info $(DATA_VOLUME_EXISTS))
ifeq ($(DATA_VOLUME_EXISTS),0)
    $(info #========# create data volume #========#)
    docker create -v ${DATA_MOUNT_POINT} --name ${DATA_VOLUME_CONTAINER} busybox
    docker cp -L ${DATA_DIR}/ ${DATA_VOLUME_CONTAINER}:${DATA_MOUNT_POINT}/
else
    $(info #========# already exists data volume #========#) 
endif

こんなMakefileを作っておけばVisual Studio CodeでIntegrated Terminalを開いておいて、 makeと打てばBrainScriptを手軽に動作させることが出来る。

f:id:tottokug:20170302002552p:plain こんな感じでVisual Stuio Code内だけで全て完結できて便利。