제공된 KSB 툴박스를 사용하지 않고, 직접 Host PC에 KSB 인공지능 프레임워크를 설치하기 위해서 아래의 오픈소스 프레임워크들을 설치합니다. 사용자 csle 계정을 생성한 후 아래 프로그램들을 설치합니다.
KSB 툴박스 설치의 csle 사용자 계정 생성 부분을 참고합니다.
KSB 툴박스 설치의 java-8-oracle 설치 부분을 참고합니다.
아래 링크를 참고하여 사용자의 PC 혹은 클러스터 환경에 맞게 설치합니다.
참고링크 : https://hadoop.apache.org/docs/r2.7.3/
다운로드 링크 : https://archive.apache.org/dist/hadoop/common/hadoop-2.7.3/
아래 링크를 참고하여 사용자의 PC 혹은 클러스터 환경에 맞게 설치합니다.
참고링크 : https://spark.apache.org/downloads.html
다운로드 링크 : https://spark.apache.org/downloads.html
아래 링크를 참고하여 사용자의 PC 혹은 클러스터 환경에 맞게 설치합니다.
참고링크 : https://hbase.apache.org/book.html
다운로드 링크 : https://archive.apache.org/dist/hbase/1.2.4/
아래 링크를 참고하여 사용자의 PC 혹은 클러스터 환경에 맞게 설치합니다.
참고링크 : https://kafka.apache.org/
다운로드 링크 : https://kafka.apache.org/downloads
아래 링크를 참고하여 사용자의 PC 혹은 클러스터 환경에 맞게 설치합니다.
참고링크 : https://zookeeper.apache.org/
다운로드 링크 : https://archive.apache.org/dist/zookeeper/zookeeper-3.4.9/
다운로드 페이지로부터 KSB 툴박스 파일을 다운로드합니다.
csle 사용자 계정의 home에 ksb_toolbox_v1.tar.gz 압축을 해제합니다. 결과적으로 /home/csle/ksb-csle 폴더가 생성됩니다.
csle@csle1:~$ tar zxvf ksb_toolbox_v1.tar.gz -C /home/csle/
/home/csle/ksb-csle 폴더는 다음의 하위 폴더들로 구성됩니다.
/home/csle/ksb-csle/conf/ksb.conf 파일을 사용자 PC에 맞게 수정합니다.
csle { user { home = "/home/csle" # 사용자 home 디렉토리를 지정합니다. } home = "/home/csle/ksb-csle" # KSB home 디렉토리를 지정합니다. submit.cli = "true" scheduler.initialization = "false" } servers { gateway { baseUrl = "http://KSB_GATEWAY:SERVICEPORT" } kubernetes { enable = "false" baseUrl = "http://SERVICENAME.ksb.local:30100" imgRepositoryUrl = "docker.io" kubernetes_yaml_path = "/kubernetes" masterIp = "csle1" # Kubernetes 마스터 도메인 이름 혹은 IP를 지정합니다. masterPort = "2243" # Kubernetes SSH 포트 번호를 지정합니다. nodesIp = "csle2, csle3" # Kubernetes 노드들의 도메인 이름 혹은 IP들을 지정합니다. user = "csle" # Kubernetes 서버의 사용자 ID를 지정합니다. externalKafka { brokerHostName = "csle1" # 외부 Kafka broker서버 도메인 이름을 지정합니다. brokerHostIp = "192.168.0.xxx" # 외부 Kafka broker서버 IP을 지정합니다. } } tensorflow { enable = "true" python_path = "/anaconda3/envs/tensorflow/bin/python" # 사용자 PC의 tensorflow python 위치를 지정합니다. python_code_project_path = "/analysis" } pyspark { python_path = "/anaconda3/bin/python" # 사용자 PC의 python 위치를 지정합니다. python_code_project_path = "/pyML" } spark { home = "/spark" # 사용자 PC의 spark home 위치를 지정합니다. bin = "/spark/bin/spark-submit" master = "local[*]" # spark master 모드를 지정합니다. deploy = "client" # spark deploy 모드를 지정합니다. logging = "true" autoIncreaseModelPath = "true" } yarn { home = "/hadoop/bin" # 사용자 PC의 yarn 위치를 지정합니다. } postgres { db = "csledb" uri = "jdbc:postgresql://localhost:5432/csledb" user = "csle" password = "csle1234" } hadoop { home = "/hadoop/" # 사용자 PC의 hadoop 위치를 지정합니다. master = "csle1" # 사용자 PC의 hadoop master 이름을 지정합니다. port = "9000" # 사용자 PC의 hadoop master port를 지정합니다. hdfs { activated = "true" baseDir = "/user/" modelPath = "/model" datasetPath = "/dataset" } webhdfs { port = "50070" baseDir = "/webhdfs/v1" } } hbase.zookeeper.quorum = "localhost" kbe { serverIp = "localhost" serverPort = "9876" serverType = "jena" } }
csle 계정의 bashrc 파일을 업데이트 합니다.
cat <<EOT >> ~/.bashrc export JAVA_HOME=/usr/lib/jvm/java-8-oracle export PATH=$PATH:$JAVA_HOME/bin export KSB_HOME=/home/csle/ksb-csle export PYTHONPATH=/home/csle/ksb-csle/pyML/:$PYTHONPATH export PYTHONPATH=./:/home/csle/ksb-csle/ksblib:$PYTHONPATH EOT source ~/.bashrc
KSB 웹툴킷에 저장된 다양한 예제를 사용하기 위해서는 웹툴킷 사용자(id: ksbuser@etri.re.kr)에 대한 Ubuntu 및 Hadoop hdfs 계정 추가가 필요합니다.
csle$myHostName: sudo adduser ksbuser_etri_re_kr [sudo] password for csle: 'ksbuser_etri_re_kr' 사용자를 추가 중... 새 그룹 'ksbuser_etri_re_kr' (1011) 추가 ... 새 사용자 'ksbuser_etri_re_kr' (1011) 을(를) 그룹 'ksbuser_etri_re_kr' (으)로 추가 ... '/home/ksbuser_etri_re_kr' 홈 디렉터리를 생성하는 중... '/etc/skel'에서 파일들을 복사하는 중... 새 UNIX 암호 입력: # ksbuser_etri_re_kr를 입력하세요 새 UNIX 암호 재입력: # ksbuser_etri_re_kr를 입력하세요 passwd: 암호를 성공적으로 업데이트했습니다 새로운 값을 넣거나, 기본값을 원하시면 엔터를 치세요 이름 []: 방 번호 []: 직장 전화번호 []: 집 전화번호 []: 기타 []: 정보가 올바릅니까? [Y/n] Y
csle$myHostName: sudo usermod -aG sudo ksbuser_etri_re_kr
csle$myHostName: su - ksbuser_etri_re_kr ksbuser_etri_re_kr$myHostName: sudo ll 합계 32 drwxr-xr-x 2 ksbuser_etri_re_kr ksbuser_etri_re_kr 4096 6월 30 08:37 ./ drwxr-xr-x 14 root root 4096 6월 30 08:36 ../ -rw-r--r-- 1 ksbuser_etri_re_kr ksbuser_etri_re_kr 220 6월 30 08:36 .bash_logout -rw-r--r-- 1 ksbuser_etri_re_kr ksbuser_etri_re_kr 3771 6월 30 08:36 .bashrc -rw-r--r-- 1 ksbuser_etri_re_kr ksbuser_etri_re_kr 655 6월 30 08:36 .profile -rw-r--r-- 1 ksbuser_etri_re_kr ksbuser_etri_re_kr 0 6월 30 08:37 .sudo_as_admin_successful -rw-r--r-- 1 ksbuser_etri_re_kr ksbuser_etri_re_kr 8980 6월 30 08:36 examples.desktop
사용자 환경에 맞게 설치되어 있는 Hadoop Hdfs를 가동한 후, 아래 명령을 이용하여 hdfs에 ksbuser_etri_re_kr 사용자 폴더를 추가합니다.
csle$myHostName: su - csle csle$myHostName: hdfs dfs -mkdir -p /user/ksbuser_etri_re_kr/dataset csle$myHostName: hdfs dfs -mkdir -p /user/ksbuser_etri_re_kr/model csle$myHostName: hdfs dfs -chown ksbuser_etri_re_kr:supergroup /user/ksbuser_etri_re_kr/ csle$myHostName: hdfs dfs -chown ksbuser_etri_re_kr:supergroup /user/ksbuser_etri_re_kr/dataset csle$myHostName: hdfs dfs -chown ksbuser_etri_re_kr:supergroup /user/ksbuser_etri_re_kr/model
KSB 웹툴킷 설치하기 페이지를 통해 KSB 웹툴킷을 설치합니다.
KSB 지식베이스엔진(KSB-Knowledge Engine)을 사용하기 위한 절차 및 예제를 소개합니다.
KSB 지식베이스 엔진은 Play framework 기반 엔진이며, 이를 실행하기 위해서는 Play framework Activator를 사전에 설치해야 합니다.
# Play framework Activator 다운로드 wget https://downloads.typesafe.com/typesafe-activator/1.3.12/typesafe-activator-1.3.12.zip # 압축해제 unzip typesafe-activator-1.3.12.zip # Activator bin 경로를 환경변수에 등록 export PATH="/home/csle/activator-dist-1.3.12/bin:$PATH"
KSB 지식베이스 엔진을 시작하려면, 해당폴더 (/home/csle/ksb-csle/bin)로 이동하여, startknowledge_service.sh 스크립트를 ip address와 port 번호와 함께 실행합니다.
# KSB 지식베이스 실행 스크립트가 있는 경로로 이동 cd /home/csle/ksb-csle/bin # KSB 지식베이스 엔진 시작 (./startknowledge_service.sh ip_address port_number) ./startknowledge_service.sh 127.0.0.1 9876
KSB 지식베이스 엔진을 종료하려면, 해당폴더 (/home/csle/ksb-csle/bin)로 이동하여, stopKnowledge_service.sh 스크립트를 실행합니다.
# KSB 지식베이스 엔진 종료
./stopKnowledge_service.sh
KSB 지식베이스 엔진이 Start 되어 있는 상황에서, 사용자가 로컬 파일에 작성된 온톨로지 파일(.owl, .rdf, .rdfs)을 KSB 지식베이스 엔진에 Upload 하는 기능을 설명합니다. 본 예제에서는 KSB 지식베이스 엔진 내부 폴더에 제공하는 공통 온톨로지 파일을 이용합니다.
# 예제 수행 온톨로지 확인을 위해 해당 경로로 이동 cd /home/csle/ksb-knowledge/KBE/ontologies
# Curl 명령어 restful request 수행 (url: /loadOntologies, parameter: 온톨로지 경로) curl -X POST http://127.0.0.1:9876/loadOntologies -H 'Cache-Control: no-cache' -H 'Content-Type: text/plain' -d ./ontologies
KSB 지식베이스 엔진에 Upload된 온톨로지는 KSB 지식베이스 엔진이 제공하는 쿼리 Restful API(http://127.0.0.1:9876/query
)를 통해 확인할 수 있습니다. 이를 위해 Restful Client(본 예제에서는 Postman)를 실행하고, URL과 질의 쿼리 내용을 아래와 같이 입력하여 실행합니다.
# 본 쿼리는 SPAQRL 1.1의 형태의 질의이며, 이는 온톨로지 thing:Thing 클래스의 서브 클래스를 검색하기 위한 쿼리입니다. PPREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> PREFIX owl: <http://www.w3.org/2002/07/owl#> PREFIX workflow: <http://csle.etri.re.kr/Workflow/> PREFIX thing: <http://csle.etri.re.kr/Thing/> select * where { ?s rdfs:subClassOf thing:Thing. FILTER (!isBlank(?s)) }
KSB 지식베이스 엔진은 IoE 정보를 지식화하여 정보의 연계, 추론을 통한 지식정보를 사용자에게 제공하는 기능이 있습니다. IoE 표준(oneM2M)의 사물 스펙을 지식화하는 기능을 제공합니다.
본 예제에서는 Json 포맷의 사물 스펙을 사용합니다.
# Json 포맷의 사물 스펙(예제로 사용한 IoE 사물의 id는 a1234이며, indoor temperature and humidity 센서입니다.) { "version": "1.0", "id": "a1234", "registrationTime": "20170102112233", "properties": { "name": "indoor_env_1", "owner": "foo@gmail.com", "description": "indoor temperature and humidity", "gid": "global_unique_id_1", "model": "modelA", "coordinates": { "latitude": 33.3, "longitude": 122.2, "altitude": 0 }, "location": "seoul korea", "users": ["bar@gmail.com"], "tag": ["my room", "temperature", "humidity"], "madeBy": "companyA", "hostedBy": "companyB" }, "resources": [ { "name": "sensors", "description": "temperature and humidity in my room", "attributes": [ { "name": "temperature", "dataType": "double", "unit": "celsius", "min": "-80", "max": "80", "description": "temperature in my room" }, { "name": "humidity", "dataType": "double", "unit": "percent", "min": "0", "max": "100", "description": "humidity in my room" } ], "operations": [ { "opType": "get", "args": ["temperature", "humidity"], "description": "get current temperature and humidity" } ] } ] }
KSB 지식베이스 엔진이 제공하는 사물등록 Restful API (http://127.0.0.1:9876/registThing
)를 통해 KSB 지식베이스 엔진에 사물 스펙정보를 등록 할 수 있습니다.
다음과 같은 쿼리 Restful API을 수행하여 결과를 확인합니다.
# 본 쿼리는 SPAQRL 1.1의 형태의 질의이며, 이는 온톨로지 thing:Thing 클래스의 인스턴스를 검색하기 위한 쿼리입니다. PPREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> PREFIX owl: <http://www.w3.org/2002/07/owl#> PREFIX workflow: <http://csle.etri.re.kr/Workflow/> PREFIX thing: <http://csle.etri.re.kr/Thing/> select * where { ?s rdf:type thing:Thing. }
KSB 지식베이스 엔진은 IoE 디바이스의 센서데이터를 이용하여, 상황을 추론할 수 있는 기능을 제공합니다.
본 예제의 시나리오는 앞에서 등록된 온도센서(thing id : a1234)로부터 온도가 28도 이상이면 더운 상황(HotContext)을 추론하고,
추론된 정보를 통해 Hue(thing id : S_HUE_light_3)를 파란색으로 켜는 동작을 하는 간단한 시나리오 입니다.
이를 위해 Hue의 제어 명령을 등록합니다. (Restful API: http://127.0.0.1:9876/addDeviceControl
)
# Json 포맷의 사물제어 스펙(id S_HUE_light_3의 Hue) [ {"id":"hue_turnon_Blue", "thingId":"S_HUE_light_3", "resourceId":"controller", "operationId":"setState", "controlContents":[ {"name":"on","value":"true"}, {"name":"bri","value":"254"}, {"name":"hue","value":"46920"}, {"name":"sat","value":"254"} ] }, {"id":"hue_turnon_Red", "thingId":"S_HUE_light_3", "resourceId":"controller", "operationId":"setState", "controlContents":[ {"name":"on","value":"true"}, {"name":"bri","value":"254"}, {"name":"hue","value":"65535"}, {"name":"sat","value":"254"} ] }, {"id":"hue_turnon_Green", "thingId":"S_HUE_light_3", "resourceId":"controller", "operationId":"setState", "controlContents":[ {"name":"on","value":"true"}, {"name":"bri","value":"254"}, {"name":"hue","value":"25500"}, {"name":"sat","value":"254"} ] } ]
추론 규칙을 적용하기 위해, KSB-Knowledge/KBE/rules 폴더의 "KBE.rues" 파일을 열고 아래와 같이 추론 규칙을 추가합니다.
# 온도센서의 센싱값이 28이상이면 이벤트 Temp_HOT을 생성합니다. [domain_temperature_hot: (?e event:hasEventValue ?v), (?v thing:hasType ?t), (?t thing:attributeName ?name), equal(?name, "temperature"), (?v thing:hasValue ?value), ge(?value, 28) -> (?e event:hasEventStatus domain:Temp_HOT) ] # 이벤트 Temp_HOT이면 더운 상황(HotContext)을 생성합니다. [HotContext_context: (?e event:hasEventStatus domain:Temp_HOT) -> (?e rdf:type domain:HotContext) ] # 더운 상황(HotContext)이면 Hue를 파란색으로 켭니다. [HotContext_service: (?e rdf:type domain:HotContext) -> (?e service:derives domain:hue_turnon_Blue) ]
본 예제를 실행하기 위해 온도센서(thing id: a1234)의 값을 32.6으로 설정하고, Restful API(http://127.0.0.1:9876/recommendDeviceControl
)를 실행합니다.
# 온도센서(thingId : a1234)의 센싱값이 32.6으로 설정합니다. { "thingId": "a1234", "resourceId": "sensors", "time": "20170330103347", "values": [ { "name": "temperature", "value": "32.6" } ] }
Restful API를 실행한 결과는 다음과 같습니다.
# 상황(context)가 "HotContext"이고, 상황에 따른 서비스(service)가 "hue_turnon_Blue"이며 그것에 해당하는 사물 제어정보를 리턴합니다. [ { "thingId": "S_HUE_light_3", "resourceId": "controller", "context": [ "HotContext" ], "service": "hue_turnon_Blue", "controls": { "sat": "254", "hue": "46920", "bri": "254", "on": "true" } } ]