PowerAI Vision은 IBM에서 출시하고 있는 GPU 컴퓨팅 서버(Minsky, Newell) 기반에서 사용할수 있도록 딥러닝용 Image classification / Object detection / Semi-auto labeling 기능을 제공해주는 툴입니다. 아직 공식 출시 전이지만 IBM Developer works 공식 사이트에 들어가보시면, 이미 PowerAI Vision 이라는 새로운 SW에 대한 소개자료 및 데모 영상, 베타 테스터 버전용 설치 파일이 제공되고 있습니다.
현재 올라와 있는 Technical preview 1.4 버전을 가지고 테스트 해보려 합니다.
설치를 위한 Prerequisite은 사이트에 나와있는데, 아래와 같습니다. 저는 Minsky (S822LC for HPC, P100 GPU 4장 탑재) 서버, Ubuntu 16.04, CUDA8, Cudnn6 버전에서 테스트해보려 합니다.
Prerequisites
Hardware
CPU: POWER8 or OpenPOWER Ecosystem, minimum 8 hardware cores
Memory: 128GB memory or larger
GPU: At least 1 NVIDIA Tesla GPU. Tesla K40 or newer. GPU memory of 1 GPU core > 4GB
Disk: > 20GB free disk disk space
Network: At least 1 ethernet interface
Software
Ubuntu 16.04 LTS (Architecture: ppc64le), Red Hat Enterprise Linux (RHEL) 7.4
Docker.io 1.12.0 or newer
NVIDIA driver version 384.59 or higher is required.
NVIDIA CUDA version 8.0.44 or higher is required.
NVIDIA cuDNN 6.0 or higher is required.
1. PowerAI Vision 설치파일 다운로드
위 사이트에 들어가보시면, 아래와 같은 링크가 있습니다. IBM 계정이 없으시면 가입하시고, 쉽게 deb or rpm 패키지를 다운로드 받으실 수 있습니다.
함께 다운로드 받을 수 있는 pdf 를 보시면 설치 과정도 참조하실 수 있습니다.
저는 아래 파일들을 다운로드 받아서, deb 패키지를 사용해 설치했습니다.
powerai-vision_1.0.TP4_ppc64el.deb
powerai-vision_1.0.TP4_ppc64el.rpm
2. deb pkg 설치하기
root@minsky:~# dpkg -i powerai-vision_1.0.TP4_ppc64el.deb
root@minsky:~# cd /opt/powerai-vision/sbin
root@minsky:/opt/powerai-vision/sbin# ./check_port.sh
root@minsky:/opt/powerai-vision/sbin# cd ../bin
root@minsky:/opt/powerai-vision/bin# ./build_image.sh
Sending build context to Docker daemon 187.4kB
Step 1/9 : FROM ppc64le/ubuntu:16.04
---> 10b52ecfd0b3
---> Using cache
---> 04dbdaa674cd
Step 3/9 : ENV DLTASK_ROOT /opt/dltask
---> Using cache
---> d348de6bd908
Step 4/9 : RUN apt-get update && apt-get install -y rsyslog python python-dev python-setuptools python-pip python-numpy python-scipy python-flask && apt-get clean
---> Using cache
---> 44585af1550f
(생략)
Successfully installed pyyaml-3.12
Requirement already satisfied: Pillow>=2.3.0 in /usr/lib/python2.7/dist-packages
Requirement already satisfied: six>=1.1.0 in /usr/lib/python2.7/dist-packages
Downloading pretrained ImageNet models (1G)...
Unzipping...
gzip: stdin: unexpected end of file
tar: Child returned status 1
tar: Error is not recoverable: exiting now
Done. Please run this command again to verify that checksum = ed34ca912d6782edfb673a8c3a0bda6d.
mv: cannot stat '/opt/py-faster-rcnn/data/imagenet_models': No such file or directory
The command '/bin/sh -c pip install --upgrade pip && cat $FRCNN_CAFFE_ROOT/caffe-fast-rcnn/python/requirements.txt | xargs -L 1 pip install && cd $FRCNN_CAFFE_ROOT && ./data/scripts/fetch_imagenet_models.sh && mv $FRCNN_CAFFE_ROOT/data/imagenet_models $FRCNN_CAFFE_ROOT/models/' returned a non-zero code: 1
1) 위에서 에러가 발생했던 부분의 수행 스크립트를 찾아서, 다이렉트 다운로드 링크 주소로 바꾸던지, 2) 혹은 별도로 다운로드 받은 imagenet_models.tgz 파일을 caffe-frcnn.tar.gz 안에 함께 넣어서 수행(물론 스크립트도 일부 변경하셔야 합니다만, 여기서는 생략하겠습니다.)하시면 정상적으로 진행됩니다. 저는 이것저것 시도하다 보니 2) 번의 방법으로 수행했습니다만, 더 간단한 1) 번 방법을 올려두겠습니다. 대신 1번 방법은 wget 으로 바로 다운로드 받을 수 있도록 local ftp 등을 구현하여 링크를 생성해두셔야 합니다.
/opt/powerai-vision/bin/build_image.sh 를 열어보시면, /opt/powerai-vision/pkg에 있는 각 build_image.sh를 순차적으로 수행하게 되어있습니다. 로그를 보니, 그 중에서 frcnn 패키지를 빌드할 때 에러가 발생했습니다. frcnn 패키지를 생성하기 위한 Dockerfile 을 열어보시면, 에러가 발생하는 지점이 보입니다. caffe-frcnn.tar.gz 을 풀어서, 내부에 있는 스크립트를 수정하고 다시 말아놓겠습니다.
root@minsky:/opt/powerai-vision/bin# cd ../pkg/frcnn
root@minsky:/opt/powerai-vision/pkg/frcnn# cp caffe-frcnn.tar.gz caffe-frcnn.tar.gz.original
root@minsky:/opt/powerai-vision/pkg/frcnn# ls -al
total 1109904
drwxr-xr-x 2 root root 4096 Apr 1 00:19 .
drwxr-xr-x 12 root root 4096 Mar 28 22:20 ..
-rwxr-xr-x 1 root root 636 Feb 16 02:14 build_image.sh
-rw-r--r-- 1 root root 1101581655 Apr 1 00:18 caffe-frcnn.tar.gz
-rw-r--r-- 1 root root 33539855 Feb 16 02:17 caffe-frcnn.tar.gz.original
-rw-r--r-- 1 root root 56 Feb 16 02:14 caffe-ld-so.conf
-rw-r--r-- 1 root root 2720 Feb 16 02:14 Dockerfile
-rw-r--r-- 1 root root 435120 Feb 16 02:17 err-handler.tar.gz
-rw-r--r-- 1 root root 942816 Feb 16 02:17 FRCNN.tar.gz
caffe-frcnn.tar.gz 압축을 푸는 것은, 다른 디렉토리에서 진행하시는 것이 좋습니다.
root@minsky:/opt/powerai-vision/pkg/frcnn# mkdir imsi
root@minsky:/opt/powerai-vision/pkg/frcnn# mv caffe-frcnn.tar.gz ./imsi
root@minsky:/opt/powerai-vision/pkg/frcnn# tar -xzf ./imsi/*.gz ./
root@minsky:/opt/powerai-vision/pkg/frcnn# vi ./imsi/data/sciprts/fetch_imagenet_models.sh
#!/bin/bash
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )/../" && pwd )"
cd $DIR
FILE=imagenet_models.tgz
if [ -f $FILE ]; then
echo "File already exists. Checking md5..."
os=`uname -s`
if [ "$os" = "Linux" ]; then
checksum=`md5sum $FILE | awk '{ print $1 }'`
elif [ "$os" = "Darwin" ]; then
checksum=`cat $FILE | md5`
fi
if [ "$checksum" = "$CHECKSUM" ]; then
echo "Checksum is correct. No need to download."
exit 0
else
echo "Checksum is incorrect. Need to download again."
fi
fi
URL=다운로드 받을 URL(Local ftp 주소 등)
:wq
위의 붉은 색 부분을 변경해줍니다. vi 모드에서 빠져나온 후 다시 패키지를 말아줍니다.
root@minsky:/opt/powerai-vision/pkg/frcnn# cd imsi
root@minsky:/opt/powerai-vision/pkg/frcnn/imsi# tar -czf ../caffe-frcnn.tar.gz ./*
이제 /opt/powerai-vision/bin/build_image.sh 을 다시 수행합니다. 저는 끝나는데까지 약 1시간 정도 걸렸습니다.
root@minsky:/opt/powerai-vision/pkg/frcnn/imsi# cd ../../../bin
root@minsky:/opt/powerai-vision/bin# ./build_image.sh
(생략)
Step 14/15 : WORKDIR /app
Removing intermediate container 3a96c32cc904
---> 8319f1228a9d
Step 15/15 : ENTRYPOINT bash -c "pm2 start websocket-relay.js -- video 9090 8080 && nginx -g 'daemon on;' && python stream.py"
---> Running in a7c2a49013b7
Removing intermediate container a7c2a49013b7
---> eb2dd5ec8358
Successfully built eb2dd5ec8358
Successfully tagged powerai-vision-video-test-stream:1.4.0
make[4]: Leaving directory '/opt/powerai-vision/pkg/video-detection-test/build_docker/ppc64le/k8s/video_streamer'
make[3]: Leaving directory '/opt/powerai-vision/pkg/video-detection-test/build_docker/ppc64le/k8s'
make[2]: Leaving directory '/opt/powerai-vision/pkg/video-detection-test/build_docker/ppc64le'
make[1]: Leaving directory '/opt/powerai-vision/pkg/video-detection-test'
생성된 docker images 들을 확인해보면, PowerAI Vision 구동을 위한 이미지들이 생성된 것이 보입니다.
root@minsky:/opt/powerai-vision/bin# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
powerai-vision-video-test-stream 1.4.0 eb2dd5ec8358 About a minute ago 1.65GB
powerai-vision-video-test-nginx 1.4.0 ed22cb20cf6f 9 minutes ago 494MB
powerai-vision-video-test-portal 1.4.0 d65010bfe046 15 minutes ago 1.87GB
powerai-vision-video-mongo 1.4.0 de0b77830144 21 minutes ago 429MB
powerai-vision-video-rabbitmq 1.4.0 87ca3c27ac86 22 minutes ago 330MB
powerai-vision-video-redis 1.4.0 81262a3784cf 26 minutes ago 188MB
powerai-vision-video-mysql 1.4.0 3b6294c6588f 32 minutes ago 346MB
powerai-vision-video-nginx 1.4.0 767335fc4c03 38 minutes ago 483MB
powerai-vision-video-portal 1.4.0 14afd66b4b5e 44 minutes ago 1.83GB
powerai-vision-preprocessing 1.4.0 1c79e45ef947 About an hour ago 1.75GB
powerai-vision-dnn-custom 1.4.0 10822f9a110c About an hour ago 3.74GB
powerai-vision-frcnn 1.4.0 dae51a58f9d2 About an hour ago 5.56GB
powerai-vision-taskanaly 1.4.0 82e86c3e5088 2 days ago 570MB
powerai-vision-taskanaly dev 82e86c3e5088 2 days ago 570MB
powerai-vision-mongodb 1.4.0 0b4c8254a88c 2 days ago 492MB
powerai-vision-portal 1.4.0 7a5c5a1e3813 2 days ago 649MB
powerai-vision-dnn 1.4.0 3953c6c13ee5 2 days ago 2.55GB
vicamo/debian jessie-ppc64el 314644e2e393 3 days ago 132MB
ppc64le/ubuntu 16.04 10b52ecfd0b3 3 weeks ago 152MB
ppc64le/ubuntu 14.04 42f269a6e745 3 weeks ago 261MB
nvidia/cuda-ppc64le 8.0-cudnn5-devel-ubuntu16.04 c620d94bf929 7 weeks ago 1.87GB
nvidia/cuda-ppc64le 8.0-cudnn6-runtime-ubuntu16.04 468aefd36d7a 7 weeks ago 970MB
ppc64le/kubernetes v1.6.1 b2c4f049e634 10 months ago 784MB
ppc64le/etcd v3.1.5 18f75e83abef 10 months ago 168MB
ppc64le/nginx-ingress-controller 0.8.3 c0e6f8e17b2d 14 months ago 510MB
ppc64le/defaultbackend 1.2 b030bcb986ca 20 months ago 10.3MB
----------- 아래는 위에서 소개하지 않았던 2번 방법입니다.
root@minsky:/opt/powerai-vision/pkg/frcnn# cp caffe-frcnn.tar.gz ./imsi/caffe-frcnn.tar.gz
root@minsky:/opt/powerai-vision/pkg/frcnn# cd imsi
root@minsky:/opt/powerai-vision/pkg/frcnn/imsi# tar -czf ../caffe-frcnn.tar.gz ./*
로컬에 받아두었던 imagenet_models.tgz를 /opt/powerai-vision/pkg/frcnn/imsi/ 폴더에 ftp 등을 이용해 업로드합니다.
root@minsky:/opt/powerai-vision/pkg/frcnn/imsi# ls -al
total 1042880
drwxr-xr-x 10 root root 4096 Mar 31 23:01 .
drwx------ 10 root root 4096 Mar 31 23:00 ..
drwxr-xr-x 16 root root 4096 Feb 16 01:55 caffe-fast-rcnn
drwxr-xr-x 4 root root 4096 Feb 16 01:48 data
drwxr-xr-x 2 root root 4096 Feb 16 01:48 deploy
drwxr-xr-x 4 root root 4096 Feb 16 01:48 end2end
drwxr-xr-x 5 root root 4096 Feb 16 01:48 experiments
-rwxr-xr-x 1 root root 2325 Feb 16 01:48 faster_rcnn_end2end.sh
-rw-r--r-- 1 root root 1067856673 Mar 31 23:05 imagenet_models.tgz
drwxr-xr-x 10 root root 4096 Feb 16 01:51 lib
drwxr-xr-x 4 root root 4096 Feb 16 01:48 models
drwxr-xr-x 2 root root 4096 Feb 16 01:48 tools
root@minsky:/opt/powerai-vision/pkg/frcnn/imsi# vi ./data/sciprts/fetch_imagenet_models.sh
#!/bin/bash
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )/../" && pwd )"
#cd $DIR
FILE=imagenet_models.tgz
CHECKSUM=ed34ca912d6782edfb673a8c3a0bda6d
if [ -f $FILE ]; then
echo "File already exists. Checking md5..."
os=`uname -s`
if [ "$os" = "Linux" ]; then
checksum=`md5sum $FILE | awk '{ print $1 }'`
elif [ "$os" = "Darwin" ]; then
checksum=`cat $FILE | md5`
fi
if [ "$checksum" = "$CHECKSUM" ]; then
echo "Checksum is correct. No need to download."
# exit 0
else
echo "Checksum is incorrect. Need to download again."
fi
fi
#echo "Downloading pretrained ImageNet models (1G)..."
#wget $URL -O $FILE
echo "Unzipping..."
tar zxvf $FILE
echo "Done. Please run this command again to verify that checksum = $CHECKSUM."
:wq
root@minsky:/opt/powerai-vision/pkg/frcnn/imsi# tar -czf ../caffe-frcnn.tar.gz ./*
root@minsky:/opt/powerai-vision/pkg/frcnn/imsi# cd ../
root@minsky:/opt/powerai-vision/pkg/frcnn# cp Dockerfile Dockerfile.original
root@minsky:/opt/powerai-vision/pkg/frcnn# vi Dockerfile
RUN pip install --upgrade pip && \
cat $FRCNN_CAFFE_ROOT/caffe-fast-rcnn/python/requirements.txt | xargs -L 1 pip install && \
cd $FRCNN_CAFFE_ROOT && ./data/scripts/fetch_imagenet_models.sh && \
mv $FRCNN_CAFFE_ROOT/imagenet_models $FRCNN_CAFFE_ROOT/models/
:wq
이제 /opt/powerai-vision/bin/build_image.sh 을 다시 수행합니다.
root@minsky:/opt/powerai-vision/pkg/frcnn/imsi# cd ../../../bin
root@minsky:/opt/powerai-vision/bin# ./build_image.sh
---------------------------------------------------
3. External IP 설정하기
PowerAI Vision Portal 에 웹으로 접근할 수 있도록 외부 IP를 설정해줍니다. 각 테스트 서버 네트워크 환경에 따라 다를텐데, 저의 경우 데모 시스템의 원격 접근 IP를 사용하였습니다. 그리고 K8S 서비스 IP 기본 대역으로 설정되어 있는 20.0.0.0/16 을 사용하는 서비스가 따로 없어서, 이를 그대로 사용했습니다.
root@minsky:/opt/powerai-vision/bin# vi config.sh
# global config for PowerAI Vision
# External IP for accessing web portal.
EXTERNAL_IP=각자 환경에 맞게 변경(예.121.xxx.xxx.xx)
# Kubernetes serice IP range, do not need to change if the default IP range is not used by other ethernets.
K8S_SERVICE_IP_RANGE=20.0.0.0/16
:wq
root@minsky:/opt/powerai-vision/bin# ./config.sh
4. PowreAI Vision 서비스 시작하기
root@minsky:/opt/powerai-vision/bin# ./powerai_vision_start.sh
INFO: Setting up GPU...
Init cuda devices...
Devices init completed!
Persistence mode is already Enabled for GPU 0002:01:00.0.
Persistence mode is already Enabled for GPU 0003:01:00.0.
Persistence mode is already Enabled for GPU 000A:01:00.0.
Persistence mode is already Enabled for GPU 000B:01:00.0.
All done.
INFO: Starting kubernetes...
INFO: Copying kubectl out of k8s image...
Booting up kubernetes cluster...
INFO: Booting up kubernetes master...
6c698ec34dac5be93dbebfe9513dc60fa4c834677a34310afbe0bdd74907c758
4a83f66506a02b50d7ceda123f9919c675d080765408ecb8466d97b50f62e31b
f30cd7ceefe5963e37bbb5abee9e434eac833d49a0c985cefc6882531855450d
ba479f7447eaa7c951040a0d2c2fff1e9b9f89e35d42204b718de5582ec569c7
Collecting GPU driver volume on /opt/powerai-vision/nvidia-driver/361.119...
Booting up kubernetes worker...
e5acf6d6306a2062b3324d324a4b897b0b3789233267fe8300b775555469cc67
02a9b8c74c01ef509a867d60e12eeadee03a63450e910f234f1c79d1be20b9f3
Checking kubernetes cluster status...
INFO: Probing cluster status #1: NotReady
INFO: Probing cluster status #2: NotReady
(생략)
docker-compose -f docker-compose-files/dev/docker-compose.yml up -d
Creating videodetectiontest_rabbitmq-server_1
Creating videodetectiontest_mysql_1
Creating videodetectiontest_redis-server_1
Creating videodetectiontest_mongo_1
Creating videodetectiontest_uwsgi-server_1
Creating videodetectiontest_nginx_1
PowerAI vision 구동이 완료되었습니다. 위 포탈 링크로 접근해봅니다.
Powerai-vision 데몬 종료는 아래와 같이 수행할 수 있습니다.
root@minsky:/opt/powerai-vision/bin# ./powerai_vision_stop.sh
Stopping video detect addon...
docker-compose -f docker-compose-files/dev/docker-compose.yml down
Stopping videodetectiontest_nginx_1 ... done
Stopping videodetectiontest_uwsgi-server_1 ... done
Stopping videodetectiontest_mongo_1 ... done
Stopping videodetectiontest_mysql_1 ... done
Stopping videodetectiontest_redis-server_1 ... done
Stopping videodetectiontest_rabbitmq-server_1 ... done
Removing videodetectiontest_nginx_1 ... done
Removing videodetectiontest_uwsgi-server_1 ... done
Removing videodetectiontest_mongo_1 ... done
Removing videodetectiontest_mysql_1 ... done
Removing videodetectiontest_redis-server_1 ... done
Removing videodetectiontest_rabbitmq-server_1 ... done
Stopping video data platform...
docker-compose -f docker-compose-files/dev/docker-compose.yml down
Stopping dev_nginx_1 ... done
Stopping dev_uwsgi-server_1 ... done
Stopping dev_rabbitmq-server_1 ... done
Stopping dev_mysql_1 ... done
Stopping dev_mongo_1 ... done
Stopping dev_redis-server_1 ... done
Removing dev_nginx_1 ... done
Removing dev_uwsgi-server_1 ... done
Removing dev_rabbitmq-server_1 ... done
Removing dev_mysql_1 ... done
Removing dev_mongo_1 ... done
Removing dev_redis-server_1 ... done
Stopping main portal...
powerai-vision-portal
powerai-vision-taskanaly
powerai-vision-mongodb
Stopping kubernetes...
Stopping kube-system services...
configmap "nginx-load-balancer-conf" deleted
daemonset "nginx-ingress-lb-ppc64le" deleted
service "default-http-backend" deleted
deployment "default-http-backend" deleted
Checking kube-system services status...
Checking kubernetes cluster status...
No resources found.
Probing cluster status #1:
Stopping kubernetes cluster...
Stop kubernetes master...
k8s-scheduler
k8s-controller-manager
k8s-apiserver
k8s-etcd
Stop kubernetes worker...
k8s-kubelet
k8s-proxy
PowerAI Vision stopped successfully.