MacではCognitive Toolkit (Microsoft Cognitive Toolkit) (以下 cntk) をインストールすることが面倒だった。。。。
Intel MKL をMacにインストールするが大変なので、 以前からDockerを使ってcntkを動かすことにしていた
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を手軽に動作させることが出来る。
こんな感じでVisual Stuio Code内だけで全て完結できて便利。