KSB 툴박스 docker 컨테이너의 인증키를 공유하기 위해 ksb-csle/tools 폴더에 있는 .ssh 폴더를 csle 홈에 카피합니다.
```sh
cp-r ~/ksb-csle/tools/.ssh/ /home/csle/
```
authorized_keys를 다른 계정이 읽고 쓸 수 없게 600 mode(소유자만 rw 가능)로 변경합니다.
```sh
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
```
**<span style="font-size: 10pt; color:red">[참고사항] 만약 보안을 위해 새로운 SSH 키를 Host PC와 docker 컨테이너가 공유할 수 있습니다.**<ahref="https://csleoss.etri.re.kr/images/contents/manual_1903/2019-07-18-ssh_key_new_generation.html"title="SSH키 생성 및 공유하기">[바로가기] SSH키 생성 및 공유하기</a>
## [Host PC] SSH 재시작하기
```sh
sudo service ssh restart
```
## [Host PC] ksb-csle 폴더 권한 변경하기
KSB 툴박스 docker 컨테이너에서 Host PC의 ksb-csle 폴더를 엑세스 할 수 있도록 폴더 권한을 변경합니다.
```sh
sudo chmod 777 -R /home/csle/ksb-csle/
```
이상으로 KSB 툴박스를 구동하기 위해 필요한 프로그램 설치 및 설정 변경을 완료하였습니다.
<ahref="https://csleoss.etri.re.kr/images/contents/manual_1903/1.5.HowToRunFirst-1903.html"title="KSB 인공지능 프레임워크 처음 실행하기">[바로가기] KSB 인공지능 프레임워크 처음 실행하기</a> 페이지로 이동하여 KSB 프레임워크를 구동하도록 하겠습니다.
업그레이드를 위해 새로운 KSB 툴박스 파일을 다운로드합니다.<ahref="https://csleoss.etri.re.kr/images/contents/manual_1903/ksb_toolbox_nvidia_v1903.tar.gz"class="link_btn"> [다운로드 링크]</a>
- ksb_toolbox_nvidia_v1903.tar.gz : KSB 툴박스 파일
기존 /home/csle/ksb-csle 폴더 이름을 변경합니다.
```sh
cd ~
mv ksb-csle ksb-csle-bak
```
csle 사용자 계정의 home에 ksb_toolbox_nvidia_v1903.tar.gz 압축을 해제합니다. 결과적으로 /home/csle/ksb-csle 폴더가 생성됩니다.
```sh
tar zxvf ksb_toolbox_nvidia_v1903.tar.gz -C /home/csle/
```
/home/csle/ksb-csle 폴더는 다음의 하위 폴더들로 구성됩니다.
- /bin : KSB 프레임워크 shell 스크립트 파일 저장 폴더
- /components : tensorflow train 예제 프로그램 저장 폴더
- /conf : KSB 프레임워크 환경설정 파일 저장 폴더
- /docker : KSB 툴박스 docker 컨테이너 실행 스크립트 저장 폴더
- /examples : CLI(Command Line Interface)를 통해 워크플로우 생성 및 submit 할 수 있는 프로젝트 폴더
- /jars : KSB 프레임워크 19.03 버전의 jar 파일 저장 폴더
- /ksblib : python 전처리 라이브러리 폴더
- /kubernetes : 쿠버네티스 환경설정 폴더
- /logs : log 저장 폴더
- /pyML : autoML python 프로젝트 폴더
- /tools: 예제 테스트를 위한 프로그램(jmeter, hadoop, kafka, maven, .ssh, webToolkit_db)
KSB 툴박스 docker 컨테이너의 인증키를 공유하기 위해 ksb-csle/tools 폴더에 있는 .ssh 폴더를 csle 홈에 카피합니다.
```sh
cp-r ~/ksb-csle/tools/.ssh/ /home/csle/
```
authorized_keys를 다른 계정이 읽고 쓸 수 없게 600 mode(소유자만 rw 가능)로 변경합니다.
```sh
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
```
**<span style="font-size: 10pt; color:red">[참고사항] 만약 보안을 위해 새로운 SSH 키를 Host PC와 docker 컨테이너가 공유할 수 있습니다.**<ahref="https://csleoss.etri.re.kr/images/contents/manual_1903/2019-07-18-ssh_key_new_generation.html"title="SSH키 생성 및 공유하기">[바로가기] SSH키 생성 및 공유하기</a>
## [Host PC] SSH 재시작하기
```sh
sudo service ssh restart
```
## [Host PC] ksb-csle 폴더 권한 변경하기
KSB 툴박스 docker 컨테이너에서 Host PC의 ksb-csle 폴더를 엑세스 할 수 있도록 폴더 권한을 변경합니다.
KSB 인공지능 프레임워크 실행하기 위해 <ahref="https://csleoss.etri.re.kr/images/contents/manual_1903/1.5.HowToRunFirst-1903.html"title="KSB 인공지능 프레임워크 실행하기">KSB 인공지능 프레임워크 실행하기</a> 페이지로 이동하여 KSB 프레임워크를 구동합니다.
단, nvidia-docker 버전 KSB 프레임워크 구동시 기존 cpu버전 툴박스와의 차이점은 위에서 생성한 /home/csle/ksb-csle/docker/19.03-nvidia/startDockerCsle.sh을 실행하여 KSB 툴박스 docker 컨테이너를 실행하고 접속하는 것일 뿐 모두 동일합니다.
UI 기반으로 KSB 인공지능 프레임워크를 사용할 수 있는 KSB 웹툴킷 설치 과정을 설명합니다.
## 설치 요구사항
- Docker 기반 KSB 툴박스 환경에서는, KSB 웹툴킷 실행을 위한 기능들이 사전에 설치 되어 있거나 설치 과정에 포함 되어 있으므로, 본 과정이 필요하지 않습니다.
- Ubuntu 16.04가 설치된 메모리 16GB 이상 데스트탑이나 노트북이 요구됩니다.
- KSB 웹툴킷은 KSB 인공지능 프레임워크를 기반으로 구동됩니다. 따라서 startKsbApiServing 을 실행하여 KSB 인공지능 프레임워크를 구동하고 있어야 합니다.
- KSB 웹툴킷은 저장소로 HDFS를 사용합니다. 따라서, 저장소로 사용할 PC에 Hadoop 및 관련 소프트웨어가 설치 되어 있어야 합니다. 설치 방법은 다음 링크를 참고 합니다. ([Hadoop 2.7.3 설치하기](https://csleoss.etri.re.kr/images/contents/manual_1.0/1.3.HowToInstallKsbFrameWork.html#host-pc-hadoop-273-%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0))
Hadoop을 설치한 후에는 ksb-csle/conf/ksb.conf 파일에서 hadoop.master 정보를 설치한 호스트명으로 설정해 주어야 합니다.
또한 hadoop.hdfs.activated 도 true로 설정해야 정상적으로 HDFS 를 저장소로 이용할 수 있습니다.(기본적으로 true로 설정 되어 있습니다.)
- DB에서 한글을 정상적으로 사용하기 위해, 호스트 운영체제의 언어를 한글로 설정 합니다. 변경 하는 방법은 다음 링크를 참고 합니다. ([Ubuntu 언어 변경](https://askubuntu.com/questions/509174/how-can-i-change-the-language-from-english-to-spanish))
- Postgresql 9.6.8 이상이 설치되어야 합니다.
- Pgadmin3 1.22.2 이상이 설치되어야 합니다.
- JDK 8 이 설치되어야 합니다. 설치 방법은 다음 링크를 참고 합니다. ([JDK 8 설치](https://csleoss.etri.re.kr/images/contents/manual_1.0/1.2.HowToInstallKsbToolBox.html#host-pc-java-8-oracle-%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0))
- Apache Tomcat 7.x가 설치되어야 합니다.
## KSB 인공지능 프레임워크 DBMS (Postgresql) 설치하기
KSB 인공지능 프레임워크는 프레임워크 사용자 정보, 생성 및 구동된 워크플로우 정보, KSB 웹툴킷에서 이용하는 UI Component 관련 정보를 관리하기 위해 Postgresql을 사용 합니다.
Postgresql 설치 버전은 9.6.8 이상를 권장하며, 다음과 같이 설치한 후 재시작합니다.
또한 Postgresql DB 접근 및 이용을 편리하게 하기 위해 Pgadmin을 설치하여 사용합니다. pgadmin3는 1.22.2 이상을 설치합니다. (Postgresql 9.6.8 이상을 설치해야 잘 동작합니다.) 툴박스 내에서 제공하는 DB restore 파일 등도 위 두 버전을 통해 백업 되었습니다.
```sh
$ sudo apt-get update
$ sudo apt-get install-y pgadmin3
```
## 외부에서 DB 접근 가능하도록 수정하기
설치된 Postgresql은 기본적으로는 localhost에서만 사용 가능합니다. 외부에서도 접근 가능하도록 하기 위해서는 다음 두 파일을 수정해야 합니다.
```sh
** postgresql remote access
$ sudo vi /etc/postgresql/9.6/main/pg_hba.conf/pg_hba.conf
#host all all 127.0.0.1/32 md5
host all all 0.0.0.0/0 md5
$ sudo vi /etc/postgresql/9.6/main/postgresql.conf
#listen_addresses = 'localhost'
listen_addresses ='*'
$ sudo service postgresql restart
```
## KSB 인공지능 프레임워크 DB 정의
Postgresql 설치가 완료되면, DB에 접속하여 DB 사용자 계정과 권한을 생성하고, 백업파일을 이용하여 KSB 인공지능 프레임워크 DB 정보를 restore 합니다.
웹파일 [csle-web_20190304.war](https://csleoss.etri.re.kr/images/contents/manual_1903/csle-web_20190304.war) 을 다운 받아 /home/csle/ui_of_csle/apache-tomcat-7.0.88/webapps 디렉토리로 복사 합니다.
그리고, csle-web_20190304.war 파일의 이름을 ROOT.war로 변경 합니다.
### Tomcat 서버 구동
/home/csle/ui_of_csle/apache-tomcat-7.0.88/bin 디렉토리에 있는
Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 10 threads.
Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered.
2018-10-22 16:51:13,925 INFO StdSchedulerFactory: Quartz scheduler 'DefaultQuartzScheduler' initialized from default resource file in Quartz package: 'quartz.properties'
2018-10-22 16:51:13,925 INFO StdSchedulerFactory: Quartz scheduler version: 2.3.0
2018-10-22 16:51:13,925 INFO QuartzScheduler: Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED started.
[INFO] [10/22/2018 16:51:13.979] [KsbApi-serving-akka.actor.default-dispatcher-2] [akka://KsbApi-serving/user/IO-HTTP/listener-0] Bound to /0.0.0.0:19999
[INFO] [10/22/2018 16:51:13.981] [KsbApi-serving-akka.actor.default-dispatcher-3] [akka://KsbApi-serving/deadLetters] Message [akka.io.Tcp$Bound] from Actor[akka://KsbApi-serving/user/IO-HTTP/listener-0#1547261392] to Actor[akka://KsbApi-serving/deadLetters] was not delivered. [1] dead letters encountered. This logging can be turned off or adjusted with configuration settings 'akka.log-dead-letters' and 'akka.log-dead-letters-during-shutdown'.
2018-10-23 08:22:18,351 WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
```
## KSB 웹툴킷 설정 업데이트
KSB 웹툴킷과 KSB 인공지능 프레임워크는 다음 사용자 정보가 저장되어 있습니다.
User ID: ksbuser@etri.re.kr / User Password: ksbuser@etri.re.kr
Chrome 브라우저(또는 HTML5 표준 호환 브라우저)를 열고 위 사용자 정보를 입력하여 로그인합니다.
```sh
http://localhost:8080
```
![login](./images/1.4_01.png)
정상적으로 로그인에 성공하면, Management 메뉴를 클릭해서 KSB 인공지능 프레임워크가 구동되고 있는 환경 정보를 csle.gw.host 와 csle.gw.port 정보에 반영 합니다.
본 매뉴얼에서는 localhost 와 19999 포트가 되겠습니다.
![management](./images/1.4_02.png)
설정이 완료되면, Tomcat 서버를 재구동 하고, KSB 웹툴킷을 이용 합니다.
```sh
$ ./catalina.sh stop
$ ./catalina.sh start
```
## 구글 Chrome 브라우저에서 캐시 제거
KSB 웹툴킷을 업데이트 하면, Chrome에서 처음에는 정상적으로 동작하지 않을 수 있습니다. Chrome이 이전 정보를 캐싱 하고 있기 때문인데요. 그럴때는 다음 절차로 캐시를 지워 주시기 바랍니다.
- KSB 웹툴킷 사이트를 오픈한 상태에서 F12 버튼을 누른다
- Chrome 의 새로고침 버튼 위에서 마우스 오른쪽 버튼을 누른 다음, '캐시 비우기 및 강력 새로고침' 을 선택한다.
## KSB 웹툴킷 회원 가입 기능 활성화를 위한 설정
KSB 웹툴킷은 이메일을 통해 사용자 가입을 처리하도록 되어 있습니다. 이를 위해 관리자의 메일 계정을 설정 하도록 되어 있으며, Gmail 계정을 통해 설정할 수 있습니다. 관리자는 uidb 의 system_configuration 테이블에 자신의 Gmail 계정을 설정할 수 있으며, 사용자가 회원 가입을 신청하면 관련 메일이 관리자의 Gmail 계정을 통해 발송 됩니다.
설정 방법은, KSB 웹툴킷에 관리자 계정(ksbuser@etri.re.kr)으로 로그인 하여 Management 메뉴의 System Configuration 탭에서 'javax.mail.session.prop.id' property에서 수정아이콘을 클릭하여 csle.manager 을 'javax.mail.session.prop.password' 에 csle1234를 입력하고 저장 아이콘을 클릭하여 수정한 사항을 저장 합니다.
이메일의 발송 시, 사용자에게 메일로 안내 되는 링크의 ip는 KSB 웹툴킷이 구동 중인 서버의 설정을 따릅니다. 만약 localhost로 구동 하였다면, KSB 웹툴킷이 구동 중인 서버에서만 가입 절차를 진행할 수 있으므로, 외부에서 접속 가능한 ip로 실행 하시기 바랍니다.
. (참고사항) KSB 툴박스 docker 컨테이너를 실행할 경우, Host pc의 /home/csle/ksb-csle 폴더를 volume 마운트해서 사용합니다. 따라서 예제 파일이나 모델 파일 등 사용자 파일은 ksb-csle 폴더를 통해 docker 컨테이너에서 접근 할 수 있습니다.
## [Docker 컨테이너] KSB 툴박스 docker 컨테이너 초기화하기
KSB 툴박스 docker 컨테이너 접속한 후, 다양한 KSB 툴박스 예제들을 실행하기 위해서 아래 명령을 통해 docker 컨테이너를 초기화 합니다. Zookeeper/Hadoop/Kafka/Hbase/웹툴킷 등 초기화를 진행합니다. PC사양에 따라 다소 시간이 걸릴 수 있습니다. 아래와 같은 메세지가 나오면 초기화가 완료된 상태입니다.
**<spanstyle="font-size: 11pt; color:red">[중요]
사용자의 host pc의 IP를 192.168.0.5로 가정하였을때 자신의 IP가 출력되면 정상입니다.**
```sh
csle@csle1: cd
csle@csle1:~$ ./startService.sh
* Restarting OpenBSD Secure Shell server sshd [ OK ]
* Restarting PostgreSQL 9.6 database server [ OK ]
ZooKeeper JMX enabled by default
Using config: /home/csle/zookeeper-3.4.9/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
Warning: Permanently added 'master,192.168.0.5'(ECDSA) to the list of
known hosts.
ZooKeeper JMX enabled by default
Using config: /home/csle/zookeeper-3.4.9/bin/../conf/zoo.cfg
Starting zookeeper ... already running as process 174.
Warning: Permanently added 'csle1,192.168.0.5'(ECDSA) to the list of
known hosts.
ZooKeeper JMX enabled by default
Using config: /home/csle/zookeeper-3.4.9/bin/../conf/zoo.cfg
Starting zookeeper ... already running as process 174.
Starting namenodes on [csle1]
csle1: Warning: Permanently added 'csle1,192.168.0.5'(ECDSA) to the
list of known hosts.
< 중간 생략 >
[info] Loading project definition from
/home/csle/ksb-knowledge/KBE/project
[info] Set current project to KBE
(in build file:/home/csle/ksb-knowledge/KBE/)
[warn] The start command is deprecated, and will be removed in a
future version of Play.
[warn] To run Play in production mode, run 'stage' instead, and then
execute the generated start script in target/universal/stage/bin.
[warn] To test your application using production mode, run 'testProd'
instead.
[info] Wrote /home/csle/ksb-knowledge/KBE/target/scala-2.11/
kbe_2.11-1.0-SNAPSHOT.pom
Warning: node.js detection failed, sbt will use the Rhino based
Trireme JavaScript engine instead to run JavaScript assets compilation,
which in some cases may be orders of magnitude slower than using
node.js.
(Starting server. Type Ctrl+D to exit logs, the server will remain in
background)
<!DOCTYPE html>
<html lang="en">
<head>
<title>Select inference rules</title>
<link rel="stylesheet"media="screen"
href="/assets/stylesheets/main.css">
<link rel="shortcut icon"type="image/png"
href="/assets/images/favicon.png">
<script src="/assets/javascripts/hello.js"
type="text/javascript"></script>
</head>
<body>
< 중간 생략 >
<!DOCTYPE html>
<html lang="en">
<head>
<title>Welcome to Play</title>
<link rel="stylesheet"media="screen"
href="/assets/stylesheets/main.css">
<link rel="shortcut icon"type="image/png"
href="/assets/images/favicon.png">
<script src="/assets/javascripts/hello.js"
type="text/javascript"></script>
</head>
<body>
<h1>addDeviceControl</h1>
</body>
</html>
csle@csle1:~$
```
jps명령을 이용하여 초기화 상태를 확인합니다.
```sh
csle@csle1:~$ jps
2336 HRegionServer
2161 HMaster
3681 Jps
1890 NodeManager
1219 DataNode
885 QuorumPeerMain
1413 SecondaryNameNode
1078 NameNode
3542 ProdServerStart
2475 Kafka
3228 Bootstrap
1597 ResourceManager
```
## [Docker 컨테이너] KSB Base Ontology 로드하기
KSB 툴박스에 포함된 RealtimeIngestToServingWithKbInTwoEngines 예제를 실행하기 위해 온톨로지를 로드합니다.
```sh
cd ~/ksb-csle/bin/
./loadKnowledge_BaseOntologies.sh localhost 9876
```
## [Docker 컨테이너] KSB 인공지능 프레임워크 구동하기
KSB 툴박스의 다양한 예제를 실행하기 위해 아래 명령으로 KSB 인공지능 프레임워크 API serving을 실행합니다.
<ahref="https://csleoss.etri.re.kr/images/contents/manual_1.0/1.2.HowToInstallKsbToolBox.html#host-pc-java-8-oracle-%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0"title="KSB 툴박스 설치">KSB 툴박스 설치</a>의 java-8-oracle 설치 부분을 참고합니다.
## [모든 서버 공통 openjdk-8 설치하기
Host PC에 Ubuntu 16.04.5를 처음 설치한 경우 java openjdk 8을 설치합니다. 아래의 내용을 터미널에 복사하여 설정 가능합니다.
`ksb.dockerize` 라이브러리를 이용하기위해서는 반드시 두개의 파일이 "modules" 폴더 안에 들어있어야 합니다. 하나는 `__init__.py`이고 다른 하나는 `base.py`입니다. `__init.py__`는 비어있는 Python 파일이어도 상관없습니다 . `base.py`는 `main_func`이라는 함수를 포함하고 있어야 합니다. 예를 들면 아래와 같습니다.
`ksb.dockerize` 라이브러리를 이용하기위해서는 반드시 두개의 파일이 "modules" 폴더 안에 들어있어야 합니다. 하나는 `__init__.py`이고 다른 하나는 `base.py`입니다. `__init.py__`는 비어있는 Python 파일이어도 상관없습니다 . `base.py`는 `main_func`이라는 함수를 포함하고 있어야 합니다. `ksb.dockerize` 라이브러리는 이 `main_func`을 불러 수행합니다. 예를 들면 아래와 같습니다.
`ksb.dockerize` 라이브러리는 이 `main_func` 을 불러 수행합니다. `x` 는 REST API를 통해 입력받을 데이터로, <b>문자열</b>형태입니다. `x` 는 단순한 Python 문자열이어도 되고 (예: `'Hello World'`), 혹은 Json 문자열이어도 됩니다 (예: `'{"input": 4}'`). 아래 보이는 예제코드는 입력값 `x`가 Json 문자열이라고 가정하고 작성된 코드입니다.
```python
importjson
defmain_func(x):
defmain_func(x,user_args=None):
# In this example, x is Python string containing Json data.
x=json.loads(x)
input=x['input']
...
...
@@ -68,11 +78,12 @@ def main_func(x):
# Return results in Python string type.
returnstr(added_input)
```
`x`는 REST API를 통해 입력받을 데이터로, <b>문자열</b> 형태입니다. `x`는 단순한 Python 문자열이어도 되고 (예: `'Hello World'`), 혹은 Json 문자열이어도 됩니다 (예: `'{"input": 4}'`). 위에 작성된 예제코드는 입력값 `x`가 Json 문자열이라고 가정하고 작성된 `main_func`입니다.
아래 코드는 `x` 가 단순 문자열이라고 가정하고 작성된 코드입니다.
아래 코드는 `x` 가 단순 문자열이라고 가정하고 작성된 `main_func`입니다.
```python
defmain_func(x):
defmain_func(x,user_args=None):
# In this example, x is Python string.
input=x
...
...
@@ -83,13 +94,15 @@ def main_func(x):
returnstr(added_input)
```
`x` 를 어떤 형태로 정의하고, 이를 `main_func` 에서 어떻게 사용할지는 <b>전적으로 사용자 자유</b>입니다. 물론, 입력으로 오는 `x`의 형태와 그를 처리하는 방식이 <b>잘 맞아야만</b> 합니다. 또한, `main_func` 은 마지막 줄에 보이는 것처럼, <b>반드시 문자열</b>형태의 결과를 `return` 해야합니다.
`x`를 어떤 형태로 정의하고, 이를 `main_func`에서 어떻게 사용할지는 <b>전적으로 사용자 자유</b>입니다. 물론, 입력으로 오는 `x`의 형태와 그를 처리하는 방식이 <b>잘 맞아야만</b> 합니다. 또한, `main_func`은 마지막 줄에 보이는 것처럼, <b>반드시 문자열</b>형태의 결과를 `return`해야합니다.
아래에서 설명하는 모든 내용들은 `x`가 Json 문자열이라고 가정하고 작성된 코드를 사용합니다. `user_args`에 대한 사용법은 아래에서 설명합니다.
아래에서 설명하는 모든 내용들은 `x` 가 Json 문자열이라고 가정하고 작성된 코드를 사용합니다.
<b>참고</b>: "modules" 폴더 안에 있는 모든 파일들은 Docker 이미지 생성 시에 이미지 내부로 복사됩니다. 따라서 `base.py`에서 자유롭게 불러들여 사용할 수 있습니다. 또한 "modues" 폴더 안에 `base.py` 외에도 여러 사용자 Python 파일들을 넣은 후 `base.py`에서 불러들여 수행할 수도 있습니다.
### 3. main_func 수행 실험하기
`ksb.dockerize`를 이용하기 전에 `main_func`이 성공적으로 수행되는지 <b>반드시</b> 테스트되야 합니다. 이를 위해, "modules"의 상위 폴더에서 Python console을 열고 (e.g. `$> python` 혹은 `$> ipython`), 아래와 같이 입력합니다.
`ksb.dockerize`를 이용하기 전에 `main_func`이 성공적으로 수행되는지 <b>반드시</b> 테스트되야 합니다. 이를 위해, "modules"의 상위 폴더에서 Python console을 열고 (e.g. `$> python` 혹은 `$> ipython`), 아래와 같이 입력합니다.
```python
frommodules.baseimportmain_func
...
...
@@ -98,33 +111,37 @@ x = '{"input": 4}'
main_func(x)
```
작성한 `main_func`이 에러없이 수행되도록 `main_func` 및 사용자 Python 코드들을 수정해야합니다.
작성한 `main_func`이 에러없이 수행되도록 `main_func` 및 사용자 Python 코드들을 수정해야합니다.
<b>참고</b>: 실험 중 발생하는 에러는 주로, 1) 해당 모듈이 없다거나 혹은 2) 해당 파일이 없다는 에러일 것입니다. 두 에러 모두 기본적인 Python 프로그래밍 에러로, Google 검색을 통해 해결할 수 있습니다. 간단하게 예를 들면,
- 해당 모듈이 없는 경우
`import`시에 "modules" (즉, 최상위 폴더이름) 로부터 시작하면 대부분 해결됩니다. 즉, `from modules.xxx import xxx` 혹은 `import modules.xxx.xxx`와 같은 식이 됩니다.
- 사용자가 만든 Python script 파일을 "modules" 폴더 안에 넣은 후 `base.py`에서 `import`하여 사용하고자 할 때 발생할 수 있습니다. 이 경우에는, `import`시에 "modules" (즉, 최상위 폴더이름) 로부터 시작하면 대부분 해결됩니다. 즉, `from modules.xxx import xxx` 혹은 `import modules.xxx.xxx`와 같은 식이 됩니다.
- 해당 파일이 없는 경우
`os.path.dirname(__file__)`을 파일경로 앞에 붙여주면 대부분 해결됩니다.
-`base.py`에서 "modules" 폴더 안에 있는 파일에 접근하고자 할 때 이 에러가 발생할 수 있습니다. 간단한 경로 문제로, Python 코드에서 `os.path.dirname(__file__)`을 읽어오는 파일경로 앞에 붙여주면 대부분 해결됩니다.
### 4. Docker 이미지 생성하기
위 과정까지 문제없이 끝났다면, 아래 Python 코드와 같이 `ksb.dockerize` 를 실행합니다.
이미지는 Python 혹은 CLI를 이용하여 생성할 수 있습니다. 아래에서 각각에 대해 설명합니다.
#### 4.1 Python 이용하여 생성하기
위 과정까지 문제없이 끝났다면, 아래 Python 코드와 같이 `ksb.dockerize`를 실행합니다.
위 명령어는 "modules" 폴더에 있는 Python 코드들을 Docker 이미지로 만듭니다. 폴더경로 (`/path/to/modules`)는 절대경로입니다. 생성되는 이미지의 이름을 변경하려면 `docker_image_name`를 바꾸면 됩니다. `ksblib.dockerize`는 8080 포트로 REST API를 제공합니다. 다른 포트로 변경하려면, 마지막 줄을 `drize.run(port=9090)`처럼 변경하면 됩니다.
위 명령어는 "modules" 폴더에 있는 Python 코드들을 Docker 이미지로 만듭니다. 폴더경로 (`/path/to/modules`)는 절대경로입니다. 생성되는 이미지의 이름을 변경하려면 `docker_image_name`를 바꾸면 됩니다. `ksblib.dockerize`는 8080 포트로 REST API를 제공합니다. 다른 포트로 변경하려면, 마지막 줄을 `drize.run(port=9090)`처럼 변경하면 됩니다.
사용자 Python 코드에서 사용하는 Python 라이브러리가 있다면 Docker 이미지 생성시에 `requirements` 옵션을 이용해 설치할 수 있습니다. 각각의 라이브러리는 `:`로 구분하면 되며, 버전 정보도 명시할 수 있습니다.
사용자 Python 코드에서 사용하는 Python 라이브러리가 있다면 Docker 이미지 생성시에 `requirements` 옵션을 이용해 설치할 수 있습니다. 각각의 라이브러리는 `:`로 구분하면 되며, 버전 정보도 명시할 수 있습니다.
라이브러리를 설치하는 또 다른 방법은, "modules" 폴더 안에 "requirements.txt" 파일을 생성하는 것입니다. "requirements.txt" 의 내용은 아래처럼 작성하면 됩니다.
...
...
@@ -133,33 +150,38 @@ numpy
scipy>=1.1.0
```
`ksb.dockerize`는 "requirements.txt" 안의 라이브러리를 먼저 설치하고, 그 후에 `requirements`로 명시된 라이브러리들을 설치합니다. 따라서 동일한 라이브러리가 두 곳에 모두 명시되었다면, `requirements`에 명시된 라이브러리가 최종설치됩니다.
`ksb.dockerize`는 "requirements.txt" 안의 라이브러리를 먼저 설치하고, 그 후에 `requirements`로 명시된 라이브러리들을 설치합니다. 따라서 동일한 라이브러리가 두 곳에 모두 명시되었다면, `requirements`에 명시된 라이브러리가 최종설치됩니다.
만일 이미 생성된 Docker 이미지가 있고, 다시 만들고 싶지 않다면 위 예제 코드에서 `drize.build()` 부분을 주석처리하면 됩니다.
이미 생성된 Docker 이미지가 있어서, 다시 만들고 싶지 않다면 위 예제 코드에서 `drize.build()` 부분을 주석처리하면 됩니다.
만약, 입력값 `x`에 정보를 담아보내지 않고 Docker 이미지로 따로 전달하고 싶은 값이 있다면, `user_args`를 사용하면 됩니다. 예를 들면, `drize.run(user_args='Hello World')`와 같이 사용자변수를 전달할 수 있습니다. 새로 이미지를 생성하지 않더라도, 사용자변수는 기존 이미지로 전달됩니다. 전달받은 `user_args`는 `main_func`에서 사용할 수 있습니다. 예를 들면 아래와 같습니다.
<b>참고</b>: `user_args`로 전달되는 값은 반드시 <b>문자열</b>이어야 합니다.
만일, 특수한 이유로, 입력값 (예: `x`) 에 정보를 담아보내지 않고 따로 전달하고 싶은 파라미터가 있다면, `user_args` 를 사용하면 됩니다. `user_args` 로 전달된 문자열값은 Docker 이미지 생성시에 "ksb_user_args.pkl" 파일로 저장되며, "modules" 폴더에 위치한 Python 코드에서 읽어올 수 있습니다. 예를 들면:
#### 4.2 CLI 이용하여 생성하기
KSB 프레임워크 소스코드 폴더 안의 "ksblib" 폴더로 이동합니다. 해당 폴더에서 아래와 같이 입력합니다.
```python
# Any python script in the "modules" folder.
defread_user_args():
importos
importpickle
$>pythonksblib/dockerize/call_dockerize.py-h
```
# Read the pickle file.
dir_name=os.path.dirname(__file__)
user_args=pickle.load(open(os.path.join(dir_name,
'ksb_user_args.pkl'),'rb'))
위 명령어는 CLI를 이용하여 Docker 이미지를 생성하는 Python script의 도움말을 출력합니다. 이 script를 이용하여 Docker 이미지를 생성하는 방법은 아래와 같습니다.
"ksb_user_args.pkl" 은 최상위 폴더 (이 예제에서는 "modules")에 저장됩니다. <b>참고</b>: 이 기능은 실험중인 기능으로, 차후에 다른 형태로 변경될 수 있습니다.
이미지 이름 (`json_image`)와 폴더경로 (`/path/to/modules`)만 필수이며, 나머지는 모두 옵션사항입니다. `--port`는 접속 포트번호이고, `--user_args`는 문자열로 표현된 사용자변수, `--python_libraries`는 설치할 Python 라이브러리를 나타냅니다.
### 5. 생성된 Docker 이미지 실험하기
### 6. 생성된 Docker 이미지 실험하기
위 과정에 따라 Docker 이미지가 성공적으로 만들어지고 실행되었다면, 아래처럼 실험해 볼 수 있습니다.
위 코드에서 보이듯이 Numpy Array를 `tobytes()` 함수를 이용하여 Bytes Array로 변환한 후에 문자열로 변환합니다. 변환된 문자열을 생성된 Docker 이미지에 전송할 때에는 `requests` 라이브러리를 사용합니다.
결과값으로는, 위에 코드에 보이듯이, 표준정규분포에서 랜덤으로 선택된 100개의 수치를 10으로 나눈 후 평균값을 낸 값이 문자열로 리턴됩니다.
#### 7.2 Image 자료 전송하기
Numpy Array가 아닌 다른 형태의 자료도 동일한 방법으로 전송이 가능합니다. 예를 들어, 그림 파일을 전송받아 조작하고 싶은 경우의 `base.py`는
```python
fromPILimportImage
fromioimportBytesIO
defmain_func(x,user_args=None):
# For Image data.
im=Image.open(BytesIO(eval(x)))
# Do whatever you want.
...
return'Some string value'
```
와 같이 작성하면 됩니다. 위 예제에서는 Pillow 라이브러리를 사용하였습니다. 따라서 Docker 이미지 생성시에 설치 라이브러리로 `pillow`를 명시해 주어야 합니다. 위 코드에서는 결과값으로 단순문자열을 돌려주지만, 그림 파일을 돌려줄 수도 있습니다 (주의: 물론 이 때도 문자열 형태로 돌려주어야 합니다).