KSB 인공지능 프레임워크 설치


제공된 KSB 툴박스를 사용하지 않고, 직접 Host PC에 KSB 인공지능 프레임워크를 설치하기 위해서 아래의 오픈소스 프레임워크들을 설치합니다. 사용자 csle 계정을 생성한 후 아래 프로그램들을 설치합니다.

csle 사용자 계정(권한 : administrator) 생성하기

KSB 툴박스 설치의 csle 사용자 계정 생성 부분을 참고합니다.

java-8-oracle 설치하기

KSB 툴박스 설치의 java-8-oracle 설치 부분을 참고합니다.

Apache Hadoop 2.7.3 설치하기

아래 링크를 참고하여 사용자의 PC 혹은 클러스터 환경에 맞게 설치합니다.

참고링크 : https://hadoop.apache.org/docs/r2.7.3/
다운로드 링크 : https://archive.apache.org/dist/hadoop/common/hadoop-2.7.3/

spark-2.3.0-bin-hadoop2.7 설치하기

아래 링크를 참고하여 사용자의 PC 혹은 클러스터 환경에 맞게 설치합니다.

참고링크 : https://spark.apache.org/downloads.html
다운로드 링크 : https://spark.apache.org/downloads.html

hbase 1.2.4(optional) 설치하기

아래 링크를 참고하여 사용자의 PC 혹은 클러스터 환경에 맞게 설치합니다.

참고링크 : https://hbase.apache.org/book.html
다운로드 링크 : https://archive.apache.org/dist/hbase/1.2.4/

kafka 2.11-0.10.0.1(optional) 설치하기

아래 링크를 참고하여 사용자의 PC 혹은 클러스터 환경에 맞게 설치합니다.

참고링크 : https://kafka.apache.org/
다운로드 링크 : https://kafka.apache.org/downloads

zookeeper 3.4.9(optional) 설치하기

아래 링크를 참고하여 사용자의 PC 혹은 클러스터 환경에 맞게 설치합니다.

참고링크 : https://zookeeper.apache.org/
다운로드 링크 : https://archive.apache.org/dist/zookeeper/zookeeper-3.4.9/

KSB 프레임워크 설치하기

다운로드 페이지로부터 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 폴더는 다음의 하위 폴더들로 구성됩니다.

ksb-csle conf 파일 설정하기

/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"
    }
}

bashrc 설정 추가하기

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 웹툴킷을 사용하기 위한 사용자 계정 추가하기

KSB 웹툴킷에 저장된 다양한 예제를 사용하기 위해서는 웹툴킷 사용자(id: ksbuser@etri.re.kr)에 대한 Ubuntu 및 Hadoop hdfs 계정 추가가 필요합니다.

Ubuntu 사용자 계정 추가하기

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

sudo 권한 부여하기

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 사용자 계정 추가하기

사용자 환경에 맞게 설치되어 있는 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 지식베이스 엔진 설치하기

KSB 지식베이스엔진(KSB-Knowledge Engine)을 사용하기 위한 절차 및 예제를 소개합니다.

Play framework Activator 설치하기

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 지식베이스 엔진 시작 및 종료 하기

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

온톨로지 파일 Upload 하기

KSB 지식베이스 엔진이 Start 되어 있는 상황에서, 사용자가 로컬 파일에 작성된 온톨로지 파일(.owl, .rdf, .rdfs)을 KSB 지식베이스 엔진에 Upload 하는 기능을 설명합니다. 본 예제에서는 KSB 지식베이스 엔진 내부 폴더에 제공하는 공통 온톨로지 파일을 이용합니다.

# 예제 수행 온톨로지 확인을 위해 해당 경로로 이동
cd /home/csle/ksb-knowledge/KBE/ontologies

KSB 공통 온톨로지

# 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 지식베이스 엔진에 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))
}

온톨로지 Upload 결과 확인 화면

IoE 사물 등록

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.
}

사물등록확인화면

IoE 사물 센서데이터를 통해 지식추론하기

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"
        }
    }
]

사물추론 확인화면