프레임워크장점단점
Theano
  • Python 지원
  • Wrapper 를 통한 높은 추상화로 사용성 편리
  • 여러 에코시스템이 존재
  •  연구용으로 많이 사용됨
  • Theano자체는 로우레벨 라이브러리
  • 큰 규모 모델에 많은 컴파일 시간
  • torch에 비해 매우 큰 라이브러리
  • 에러메시지가 부정확
Torch
  • 모듈화된 라이브러리로 상호 연계가 쉬움
  • GPU지원, 본인 레이어 타입 작성이 편리
  • 선훈련된 모델들이 많음
  • Lua 기반
  • 회귀 뉴럴 네트워크에 적합하지 않음
  • 문서화 부실
TensorFlow
  • Python + Numpy
  • 컴퓨팅 그래프 추상화
  • Theano보다 빠른 컴파일
  • 시각화를 위한 TensorBoard
  • 데이터와 모델의 병렬화
  • 다른 프레임워크보다 느림
  • Torch보다 훨씬 큰 라이브러리
  • 선 훈련된 모델이 적음
  • 계산 그래프가 Python으로 되어 있어서 느림
  • 도구로서의 기능이 약함
Caffe
  • 이미지 프로세싱에 적합
  • 잘 튜닝된 네트워크
  • 코드 작성없이 모델 트레이닝 가능
  • Python인터페이스가 유용
  • GPU를 위해서는 C++/CUDA작성 필요
  • 회귀 네트워크에는 부적합
  • 큰 네트워크에는 부적절
  • 확장성이 떨어짐
MxNet
  • 혼합 패러다임 지원(symbolic/imperative)
  • 자동 미분화
  • GPU, mobile에서도 동작
  • 여러 언어 지원(C++, Python, R, Scala, Julia, Matlab and Javascript)
  • 최적화된 C++ 엔진으로 좋은 성능
  • 로우 레벨 텐서 연산자가 적음
  • 흐름 제어 연산자 지원하지 않음
  • 컴파일 세팅에 따라 결과가 달라짐.
  • 자신의 커스컴 레이어 생성을 위해서는 어느정도 백엔드 텐서 라이브러리 이해가 필요


Lucene(루씬)

검색 엔진의 가장 중요한 부분을 담당하는 "색인" 과 "검색" 을 위한 자바로 개발된 라이브러리 이다.

아파치 재단에서 만들어진 프로젝트 이고, 다양한 플랫폼을 지원한다.



Solr(솔라)

솔라는 파일을 인덱스하는 검색엔진으로 XML 요청을 HTTP를 통해 보내는 웹 서비스 API가 있는 검색 서버이다. 

그러므로 솔라 검색서버 URL을 사용하여 인터넷을 통해 (HTTP) 파일을 질의하여 인덱스하는 어느 곳에서나 접근할 수 있다. 

또한 다른 솔라 검색 서버로 캐싱과 복사가 가능한 최적화된 검색 서버다.



Nutch(넛츠)

오픈소스 웹 검색 소프트웨어로 웹 크롤러의 기능을 제공하고, 수집된 정보들은 루씬을 통하여 검색이 이루어 진다.



정리하자면 

루씬은 검색을 위한 API,

솔라는 검색서버,

넛츠는 자료/정보를 수집하는 크롤러  

인 셈이다.

개요

머신러닝(Machine learning)과 딥러닝(Deep learning)은 화두다! 언제부터인지 주위에 이 단어들을 쓰는 사람들을 굉장히 많이 보았을 것이고 들어봤을 것입니다. (그들의 차이점을 알건 모르건을 떠나서 말이죠!) 얼마나 많은 사람들이 관심을 가지고 있는지 알기 위해서, 키워드로 검색한 구글 트렌드 결과입니다.


만약 머신러닝과 딥러닝의 차이점이 궁금하다면, 비전문가의 말로 풀어쓴 이 글이 도움이 될 것입니다. 전문 용어들을 설명하였고, 두 가지의 차이점과 어떻게 활용할 수 있을지 설명하였습니다. 

"머신러닝(Machine Learning)과 딥러닝(Deep Learning)이 무엇일까요?" 

"머신러닝(Machine Learning)이 무엇일까요?"

"딥러닝(Deep Learning)이 무엇일까요?"

     

1. 머신러닝(Machine Learning)과 딥러닝(DeepLearning)이 무엇일까요?

기초부터 시작해보겠습니다. 만일 머신러닝과 딥러닝의 차이점을 이미 알고계신다면 

section 2로 넘어가시면 됩니다. 


1.1 머신러닝(Machine Learning)이 무엇일까요?

Tom Mitchell의 정의가 가장 많이 인용되고 있는데 저 또한 동의합니다. 

A computer program is said to learn from experience E with respect to some class of tasks T and performance measure P if its performance at tasks in T, as measured by P, improves with experience E.

이해가 잘 안되시나요? 더 간단한 예제로 가보겠습니다.


예제 1 - Machine Learning - 키(height)를 기반으로 몸무게(weight) 예측하기

예를 들어서 당신이 어떤 사람의 키를 기반으로 몸무게를 예측하는 시스템을 만든다고 해봅시다. 가장 첫번째로 당신이 해야할 일은 데이터를 수집(collect)하는 것입니다. 데이터가 이런 형태를 보인다고 가정해봅시다.  


그래프의 각 점은 하나의 데이터(record)를 뜻합니다. 시작하기에 앞써 우리는 키를 기반으로 하여 몸무게를 예측하기 위해 선 하나를 그어볼 수 있겠습니다. 선은 이런 수식으로 표현될 수 있을 것입니다. 

몸무게 (kg) = 키 (cm) - 100

이 공식은 우리의 예측에 도움을 줄 것입니다. 지금 이 공식만으로도 만족스럽긴 하지만 우리는 '성능'을 이해하고 향상하기 위해 노력해야 할 것입니다. 이 경우, 우리는 성능 향상을 위해 실제값(y)과 예측값(y-hat)의 차이를 줄여야 할 것입니다. 이것이 성능을 측정하는 방법입니다. 

더 나아가, 데이터가 많을수록(즉, 경험이 많을수록), 더 나은 성능의 모형이 만들어질 것입니다. 또한 추가 변수(variables)를 넣어보면서(ex. 성별 등) 선의 위치도 조금씩 변화시켜 볼 수 있을 것입니다. 


예제 2 - 폭풍 예측 시스템(Storm prediction System)

조금 복잡한 예제를 보겠습니다. 당신이 폭풍 예측 시스템을 만들고 싶다고 가정해봅시다. 당신은 과거에 있었던 storm에 관한 정보들과 이와 더불어 그 storm이 발생하기 3개월전 날씨 상태를 데이터로 보유하고 있습니다. 

만일 손과 눈으로만 이 폭풍 예측 시스템을 만들려고 한다면 우리는 어떻게 해야할까요?


가장 첫번째로 해야 할 일은 모든 데이터를 샅샅이 뒤져 패턴을 찾는 것입니다. 목표는 어떤 조건이 폭풍을 일으키냐 겠지요? 

그 결과 조건은 이러할 수 있습니다. '기온이 40도 이상으로 올라갈 때, 습도는 80~100사이를 유지함'

그리고 이 조건을 그대로 우리 시스템에 적용할 것입니다. 

또 다른 경우는 폭풍이 발생할지 안할지에 대해서 과거 데이터를 모두 훑어보고 폭풍이 일어날 가능성이 가장 높은 사유들을 꼽아볼 것입니다. 이렇게 시스템이 셋팅이 된다면 우리의 사유가 얼마나 잘 예측했는지 폭풍 발생 여부에 따라 확인할 것입니다. 그리고 이 작업을 반복적으로 진행하여, 더 나은 예측 성능을 위해 수정할 부분은 수정할 것입니다. 


다시 우리가 이해하였던 1.1에서의 머신러닝 정의를 빗대어 생각해봅시다. 

우리의 목표 'T'는 어떤 환경적 조건이 폭풍을 일으키는지 찾는 것이었고, 성능 'P'는 그러한 조건 속에서 폭풍 발생 여부에 대한 예측을 몇 번이나 맞추었는지에 대한 결과입니다. 그리고 경험 'E'는 그 시스템을 몇 번 반복을 하냐 입니다. 


1.2 딥러닝(Deep Learning)이 무엇일까요?

딥러닝의 개념은 아주 새로운 것은 아닙니다. 2년전부터 이 이야기가 돌긴 하였지만 요새의 트렌드때문에 딥러닝은 더욱 뜨거운 관심을 받고 있습니다. 1.1에서 머신러닝의 정의를 살펴본 것처럼 딥러닝의 formal definition부터 알아보고 예제를 보여드리겠습니다. 

Deep learning is a particular kind of machine learning that achieves great power and flexibility by learning to represent the world as nested hierarchy of concepts, with each concept defined in relation to simpler concepts, and more abstract representations computed in terms of less abstract ones.


헷갈리실 것이에요. 간단한 예제를 살펴보겠습니다. 


예제 1 - 도형 구분

개념적으로 어떻게 진행되는지 간단한 예를 살펴보겠습니다. 어떻게 인간이 정사각형과 다른 도형을 인지하는지 알아봅시다. 


가장 먼저 우리의 눈은 도형에 4개의 선들이 있는지 없는지를 확인합니다. (이 단계가 simple concept입니다.) 우리가 4개의 선을 찾는다면, 그 다음 스텝으로는 이 선들이 연결되어있는지,닫혀있는지(closed), 직각인지, 선의 길이가 동일한지 찾아볼 것입니다. (이 단계가 nested hierarchy of concepts입니다.)

다시 정리해보면, 우리는 복잡한 task(즉 정사각형을 구분하는 일)를 좀 덜 추상적인 task로 구분하였습니다. 딥러닝이 바로 이러한 개념으로 실행된다고 보면 됩니다. 


예제 2 – Cat vs. Dog

사진을 보고 개인지 고양이인지 구분하는 것을 예로 들어봅시다. 


만일 이 문제를 머신러닝으로 풀으려 한다면, 우리는 변수들(features)를 이렇게 정의할 것입니다.

*참고. 머신러닝, 딥러닝에서는 input 변수를 feature라고 부릅니다. 저는 variable이라는 표현이 더 익숙했었던건지 새롭게 와닿았습니다. 양쪽다 맞는 표현이지만 feature라는 표현이 좀 더 머신러닝/딥러닝의 개념과 유사하게 느껴집니다. 


동물이 수염이 있는지 없는지,귀가 있는지 없는지, 만일 있다면 솟아있는지 등을 확인할 것입니다. 정리하자면 우리는 시스템으로 feature 중 무엇이 특정 동물(이번 예제의 경우 개인지 고양이인지)을 더 잘 묘사하는지를 구분할 것입니다.
딥러닝에서는 여기서 한 스텝 더 나아갑니다. 딥러닝은 분류에 있어 중요한 feature를 자동적으로 골라냅니다. 머신러닝은 수동적으로 중요한 feature를 제공하는 반면에요.
딥러닝은 이렇게 움직이는 것입니다. – 어떤 정보(edge)가 개와 고양이를 가장 잘 구분할지를 찾는 것입니다.


2. 머신러닝과 딥러닝의 비교

1장에서는 머신러닝과 딥러닝의 대략적인 개요를 살펴보았습니다. 이제 우리는 특히나 중요한 몇 가지 포인트들과 두 방법론의 테크닉 차이를 비교해보겠습니다. 


2.1 데이터 의존도(Data dependencies)

딥러닝과 전통적이 머신러닝에 있어 가장 큰 차이점은 데이터 양에 따른 성능입니다. 데이터 양이 작다면 딥러닝 알고리즘의 성능은 잘 나오지 않습니다. 왜냐하면 딥러닝 알고리즘은 어떤 과제를 이해하기 위해서 매우 큰 데이터가 필요하기 때문입니다. 그와 반면에, 똑같은 시나리오에서는 수작업이 들어간 전통적인 머신러닝 알고리즘이 더 우세합니다.



2.2 하드웨어 의존도(Hardware dependencies)

딥러닝 알고리즘은 고사양 machine이 많은 부분을 좌지우지합니다. 그와 반대로 머신러닝은 저사양 machine에서도 실행이 가능합니다. 이 이유는 무엇일까요? 딥러닝 알고리즘의 요구사항(requirements)는 GPU가 포함되기 때문입니다. GPU는 작업에서 숫자 계산을 담당합니다. 딥러닝 알고리즘은 본질적으로 많은 양의 행렬 곱셈(matrix multiplication)을 수행합니다. 이 작업은 GPU의 구축 목적과 같기 때문에, GPU를 사용하면 보다 효율적으로 최적화 할 수 있습니다.


2.3 Feature engineering

Feature engineering은 데이터 복잡성을 줄이고 학습 알고리즘에서 패턴을 보다 잘 보이게 하는 과정입니다. 이 과정은 시간과 전문가가 필요하다는 관점에서 어렵고 비쌉니다. 머신러닝의 경우, 대부분의 적용된 변수(feature)는 전문가가 식별한 다음 정보 영역 및 데이터 유형별로 손으로 코딩해야 합니다.

*참고. 쉽게 설명드리자면, A은행에서 신용등급을 평가하는 모형을 만든다고 가정해봅시다. A은행에서 가지고 있는 데이터를 활용해 머신러닝 알고리즘에 대입해 보았더니 대략 50개 정도의 변수가 유의미하다고 내뱉어졌습니다. 하지만 우리는 50개 변수 모두 활용할 수 없습니다. 비즈니스적 요건이나 금융당국의 규제에 따라 제거되어야 하는 변수들이 있을 수 있겠지요. 예를 들자면, 학력 정보(중졸/고졸/대졸 등)나 성별 정보입니다. 이런 경우가 전문가가 직접 확인하고 걸러내는 작업입니다. 


예를 들어, 변수가 픽셀값, 모양, 텍스쳐, 위치, 방향이라고 가정해봅시다. 대부분의 머신러닝 알고리즘 성능은 변수가 어느 정도로 정확히 식별되고 추출되는가에 달려 있습니다.
딥러닝 알고리즘은 high-level features를 학습합니다. (고차원적인 변수로 이해하시면 될 것 같습니다.) 이 부분이 딥러닝이 머신러닝보다 좀 더 앞서 있다라는 특징입니다. 따라서 딥러닝은 모든 과제에서 새로운 변수 추출이라는 작업을 줄여줍니다. Convolutional Neural Network의 경우,  초기 layer에서는 이미지의 edge나 line같은 low-level features를 학습하고 그 다음 이미지의 high-level 표현을 학습합니다. (그림과 함께 보시면 이해에 도움이 되실 것입니다.)


2.4 문제 해결 접근법(Problem Solving approach)

전통적인 머신러닝 알고리즘으로 문제를 해결할 때에는 주로 문제를 여러 개의 파트로 쪼갠 후, 각각에 대한 답을 구하고 그 결과를 합치는 방법을 추천합니다. 딥러닝은 그와 대비되게 end-to-end방식으로 문제를 해결합니다. (end-to-end가 명확하지 않으니 다음 예제를 참고하십시오.)
예제를 들어보겠습니다.
만약 당신이 사물 인지 작업을 진행해야 한다고 가정해봅시다. 그리고 사물이 무엇인지 그리고 사진 어디에 해당 사물이 위치하고 있는지를 구별해내는 것이 과제입니다.


대게의 머신러닝 접근 방법은 문제를 1.사물 탐지/2.사물 인지 두 개의 step으로 나눌 것입니다. 먼저, ‘grabcut’과 같은 경계 탐지 알고리즘(bound box detection algorithm)을 사용하여 이미지를 훑어보고 가능한 모든 객체를 찾습니다. 그리고 발견된 모든 개체들 중에서 HOG가있는 SVM(Support Vector Machine)과 같은 객체 인식 알고리즘을 사용하여 관련 객체를 인식합니다.
반면, 딥러닝 접근방법은 end-to-end입니다. 예를들어 YOLO net(딥러닝 알고리즘 중 하나)에서 이미지를 전달하면 객체의 이름과 함께 위치가 표시됩니다.


2.5 실행 시간(Execution time)

딥러닝 알고리즘은 훈련(train) 시간이 굉장히 오래 걸립니다. 딥러닝 알고리즘에서는 다른 알고리즘 대비 변수가 너무 많기 때문입니다. 최신 딥러닝 알고리즘인 ResNet의경우 training이 약 2주 정도 걸립니다. 하지만 머신러닝은 수 초에서 수 시간으로 비교적 적은 시간이 걸립니다.
test에서의 시간은 반대로 딥러닝 알고리즘에서 훨씬 적은 시간이 소요됩니다.
반면, k-nearest neighbors (머신러닝 알고리즘의 일종)의 경우 데이터 크기가 커질수록 테스트 시간이 길어집니다. 이것은 일부 머신러닝 알고리즘은 너무 작은 테스트 시간을 갖고 있기 때문에 모든 머신러닝 알고리즘이 그렇다고 볼 수 는 없습니다.

* 모델링에는 train set과 test set이 존재합니다. 단어에서 얼추 유추하셨을 수 있겠지만, 우리가 일반적으로 실제값에 가까운 모델을 만들기 위해 활용되는 데이터셋은 train set이고, 이 train set으로부터 적합된 결과가 타당하지 검사할 때 쓰는 데이터가 test set입니다. 정리하자면, linear model(y = ax +b)에서 train set으로 input 변수 x에 해당하는 적절한  a,b 값을 찾았다면, test set의 input 변수 x값으로 최종 성능이 train set의 성능과 유사하게 산출되는지 검증한다고 보시면 됩니다. 


2.6 해석력(Interpretability)

마지막으로 머신러닝과 딥러닝을 비교할 수 있는 또 다른 요인으로는 ‘해석력’을 들 수 있습니다. 이 요인이 딥러닝이 실제 실무에 쓰려 마음 먹으면 그 전에 10번 정도는 고민하는 이유입니다.

예제를 들어볼게요. 에세이의 점수를 자동으로 매기기 위해 딥러닝 알고리즘을 활용했다고 해봅시다. 성능은 거의 사람이 한 것과 유사할 정도로 뛰어납니다. 하지만, 아주 치명적인 문제가 있긴 합니다. 왜 이 점수가 부여됐는지는 알 수 없기 때문입니다. 사실 수학적으로 딥러닝의 어느 노드가 활성화되었는지를 알 수 있긴 하지만, 우리는 거기에 어떤 뉴런이 만들어 졌는지, 그리고 이들 뉴런 레이어가 전제적으로는 무엇을 하고 있는지 알지 못합니다. 그래서 우리는 결과를 해석하지 못합니다.
하지만, 의사결정나무(decesion tree)와 같은 머신러닝 알고리즘은 왜 선택됐는지 명확한 rule이 제공되기 때문에 해석하기가 특히 쉽습니다. 따라서 ‘해석’이 필요한 산업에서는 의사결정나무나 선형회귀모형, 로지스틱회귀모형이 활용됩니다. 
반면에 의사 결정 트리와 같은 기계 학습 알고리즘은 왜 선택한 알고리즘을 선택했는지에 대한 명확한 규칙을 제공하므로 배후의 추론을 해석하기가 특히 쉽습니다. 따라서 결정 트리 및 선형 / 로지스틱 회귀와 같은 알고리즘은 주로 업계에서 해석 가능성을 위해 사용됩니다.


3. 머신러닝과 딥러닝은 현재 어디서 쓰이고 있나?

컴퓨터 비전: 자동차 번호판 인식, 안면인식 등



출처 : https://brunch.co.kr/@itschloe1/8

Solr

사이즈가 큰 데이터 검색에 용이에 문서 검색에 적합하나 색인주기가 느림 (주로 문서검색용)

ElasticSearch

사이즈가 작은 데이터에 대한 속성검색/연관검색/실시간 검색에 용이함 (주요 커머스검색용)




Solr search ( 쏠라 ) Elasticsearch ( 엘라스틱 )
개발사 Apache Software Foundation Elasticsearch
노드 1)  컨트롤 주체 Apache ZooKeeper (별도 프로그램) -> 구동 시 리소스 부하  운영 중 스키마 변경 불가 자체 Node (마스터노드) -> 구동 시 부하 적음  운영 중 스키마 변경 가능
샤드 2)  변경 방식 별도의 노드 분할 처리 필요(서버 재구동 필요) 자동 노드 분할(서버 구동 불필요)
색인업데이트 방식 전체 데이터를 캐시로 추가 저장 변경 데이터만 캐시로 추가 저장
개발언어 JSON (limited), XML (limited),URL parameters JSON
연동가능 분석모듈 (ECOsystem) 주로 Banana, Zeppelin with Community JSon 지원 모듈이면 OK(ex. Kibana, Grafana 등)
주요 활용영역 문서  원문 검색 상품검색  이상징후 감지 & 모니터링
속도 검색 느림 빠름
색인 수 십분 초 단위
분석 준실시간 실시간
장점 •안정화 단계의 검색•사이즈가 큰 장문 데이터 검색에 용이 •실시간 색인 가능•계층 구조의 다양한 속성 검색/연관검색 가능
단점 •색인 주기 느림•계층 구조의 속성 검색 힘듦 •사이즈가 큰 장문 데이터 검색 시 속도 저하


주1) 노드(Node) : 분산처리 구조 상 서버와 유사한 개념의 구분 단위

주2) 샤드(Shard) : 분산구조 상 인덱스 단위로서 단일 노드엔 여러 개의 샤드가 존재

AI를 기업의 비즈니스에 적용할 기가 막힌 아이디어가 있다고 해도 이를 기업에 적용 가능한 솔루션으로 성공적으로 구현하기 위해서는 기업 구성원의 마음가짐 변화와 추진을 위한 적극적인 리더십의 확보, 그리고 기업 업무 전반에 걸친 지원팀의 구성이 선결되어야 한다. AI 적용을 비롯한 기업의 디지털 트랜스포메이션이 성공하기 위해서는 데이터와 IT 기술 인프라를 통합하여야 하며 데이터와 인프라에 대한 전반적인 통합 및 관리 능력을 확보하지 못한 상황이라면 섣불리 AI를 적용하겠다고 뛰어드는 것은 바람직하지 않다. 기업이 이미 빅데이터를 효과적으로 활용할 수 있는 기술과 업무 응용 능력을 갖추었다고 판단되지 않으면 AI 적용은 시기상조다. 데이터에 대한 이해와 활용능력이 없이 AI 도입을 추진하는 것은 성공하기 어렵다.

그리고 기업 오너 또는 경영진이 스스로 통찰력과 판단력이 뛰어나다고 과신하고 조직 전체가 상명하복의 문화에 젖어 있다면 성공적인 AI의 적용이 어려워진다. 기업 경영진이 데이터와 팩트에 기반한 의사결정이 직관에 의한 결정보다 미래의 비즈니스를 위해 더 효율적이라고 공감할 때가 AI 도입을 추진해야 할 시점이다. 아울러 성공적인 AI의 도입을 위해서는 기업 전 조직의 적극적인 협조가 필요하므로 AI 도입에 따른 일부 부서의 두려움과 반감을 불식시키는 공감대의 형성이 선결되어야 한다.

AI 도입을 위한 기업 문화의 형성이 이루어졌다면 본격적으로 기술적인 문제에 대한 접근이 필요하다. AI의 구현을 위한 머신러닝을 포함한 기술적 역량은 기업의 기존 전통적인 정보시스템을 성공적으로 구현하고 운영한 기술적 역량과는 근본적으로 다르다. 머신러닝은 고도의 실험적이고 탐구적인 영역으로 구체적인 구현 일정과 성공적 완료 기준을 설정하기 매우 난해한 분야이다. 머신러닝을 위한 개발자에게는 기존의 소프트웨어 개발과 관련된 분야보다 수학과 통계학 분야의 역량이 훨씬 더 많이 요구된다. 그런데 현재 이런 역량을 갖춘 개발자는 구하는 것이 상당히 어렵다. 그리고 해당 기업의 AI 개발자를 구할 때 반드시 기업의 비즈니스 영역에 대한 지식과 관련 데이터에 대한 이해력을 갖춘 인력을 선별하여야 한다.

AI 적용을 위한 기술 조직의 구성이 마무리되면 구체적인 구현 계획을 수립할 단계이다. AI 도입 시 본격적인 투자에 앞서 ‘AI 도입을 통해 어떤 문제를, 왜 해결하려고 하며 이것이 기업에서 우선순위가 높은지, 그리고 문제 해결이 성공적으로 되었다는 것을 어떻게 측정할지에 대한 지표가 있는가?’라는 질문을 해봐야 한다.

AI의 구현은 텐서플로, 파이토치, 케라스 등의 오픈소스 또는 클라우드 서비스를 활용하는 방안과 기업 독자적인 플랫폼을 구축하는 방안이 있으며 기업의 상황에 맞게 선택한다. 적용할 분야가 기업의 장기적인 성장에 핵심적인 영역인지, 기업 내부적으로 기술 역량은 갖추어졌는지, 구체적인 목표 시기는 언제인지, AI 적용을 위한 데이터는 마련되어 있는지 그리고 마지막으로 전체 TCO 측면에서 자체 구축과 외부 솔루션 도입 중 어느 것이 적절한 방안인지 결정하여야 한다. 명심하여야 할 점은 머신러닝이 기업의 모든 분야에 적용할 수 있는 것도 아니며 어떠한 솔루션도 해당 기업의 비즈니스에 바로 적용 가능하지 않다는 점을 인지하여야 한다.

위 단계까지 완료된 상황이라면 이제부터 해당 영역과 관련된 데이터를 수집하고 준비할 단계이다. 기업 비즈니스 관련 영역의 문제를 AI를 이용하여 성공적으로 해결하기 위해서는 해당 문제를 어떻게 정의하고 정의된 문제와 관련하여 왜곡되지 않고 편향적이지 않은 데이터를 정확하게 수집, 축적할 수 있느냐 없느냐에 AI 적용 성공 여부가 달려 있다고 해도 과언이 아니다.

그다음 단계는 AI 구현을 위한 머신러닝 모델을 개발하는 것이다. 현재 머신러닝은 아직 초기 발전단계라고 볼 수 있으며 지속해서 다양한 기술이 실험되고 개발되고 있는 분야이다. 또한 머신러닝이 모든 문제를 해결할 수 있는 만능 도구도 아니다. 따라서 적절한 모델을 선택하고 기업 내의 데이터를 통해 학습, 발전시켜야 한다. 머신러닝에 있어 데이터의 정확도가 AI의 정확도를 좌우한다. 또한 구현된 모델의 지향 범위가 너무 좁지도, 넓지도 않아야 최적의 결과를 얻을 수 있다. 다음의 그림은 머신러닝을 데이터를 이용해 지속해서 학습시키는 단계를 반복 사이클로 표현한 것이다.



기업의 AI 도입을 위한 단계는 다음과 같이 다섯 단계로 요약한다.

1. AI 도입을 위한 기업 내 환경과 문화를 구축한다.
2. AI 도입을 위한 기술 조직을 구성한다.
3. 구체적인 구현 일정 및 방법을 수립한다.
4. 데이터를 수집하고 준비한다.
5. 머신러닝 모델을 실험하고 학습시키고 문제점을 찾아 모델을 개선한다. 이 단계를 반복적으로 지속하여 원하는 문제를 해결하는 AI 시스템을 완성한다.

보다 상세한 내용은 서적을 참고하시기 바랍니다.

[참고] Yao, Mariya. Applied Artificial Intelligence: A Handbook For Business Leaders, TOPBOTS, 2018, Kindle Edition.


*정철환 팀장은 삼성SDS, 한양대학교 겸임교수를 거쳐 현재 동부제철 IT기획팀장이다. 저서로는 ‘SI 프로젝트 전문가로 가는 길’이 있으며 삼성SDS 사보에 1년 동안 원고를 쓴 경력이 있다. 한국IDG가 주관하는 CIO 어워드 2012에서 올해의 CIO로 선정됐다. ciokr@idg.co.kr

원문보기: 
http://www.ciokorea.com/news/39711#csidx0ddb62e665e4a7f92bfc051225ba555 

파티션 정보 확인

[root@server /]# fdisk -l


Disk /dev/xvda: 21.5 GB, 21474836480 bytes

255 heads, 63 sectors/track, 2610 cylinders

Units = cylinders of 16065 * 512 = 8225280 bytes

Sector size (logical/physical): 512 bytes / 512 bytes

I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk identifier: 0x0009458d


    Device Boot      Start         End      Blocks   Id  System

/dev/xvda1   *           1         131     1048576   83  Linux

Partition 1 does not end on cylinder boundary.

/dev/xvda2             131         392     2097152   82  Linux swap / Solaris

Partition 2 does not end on cylinder boundary.

/dev/xvda3             392        2611    17824768   83  Linux


Disk /dev/xvdb: 85.9 GB, 85899345920 bytes

255 heads, 63 sectors/track, 10443 cylinders

Units = cylinders of 16065 * 512 = 8225280 bytes

Sector size (logical/physical): 512 bytes / 512 bytes

I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk identifier: 0x00000000



파티션 만들기

[root@server /]# fdisk  /dev/xvdb


Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel

Building a new DOS disklabel with disk identifier 0xd56ebe5a.

Changes will remain in memory only, until you decide to write them.

After that, of course, the previous content won't be recoverable.


Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)


WARNING: DOS-compatible mode is deprecated. It's strongly recommended to

         switch off the mode (command 'c') and change display units to

         sectors (command 'u').


Command (m for help): m <<= 도움말 보기

Command action

   a   toggle a bootable flag

   b   edit bsd disklabel

   c   toggle the dos compatibility flag

   d   delete a partition

   l   list known partition types

   m   print this menu

   n   add a new partition

   o   create a new empty DOS partition table

   p   print the partition table

   q   quit without saving changes

   s   create a new empty Sun disklabel

   t   change a partition's system id

   u   change display/entry units

   v   verify the partition table

   w   write table to disk and exit

   x   extra functionality (experts only)


Command (m for help): p <<= 파티션 테이블 확인


Disk /dev/xvdb: 85.9 GB, 85899345920 bytes

255 heads, 63 sectors/track, 10443 cylinders

Units = cylinders of 16065 * 512 = 8225280 bytes

Sector size (logical/physical): 512 bytes / 512 bytes

I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk identifier: 0xd56ebe5a


    Device Boot      Start         End      Blocks   Id  System


Command (m for help): n <<= 새 파티션을 추가

Command action

   e   extended

   p   primary partition (1-4)

p

Partition number (1-4): 1 <<= 1번 파티션 입력

First cylinder (1-10443, default 1): 엔터(기본으로 1 적용)

Using default value 1

Last cylinder, +cylinders or +size{K,M,G} (1-10443, default 10443): 엔터(기본으로 10443 적용)

Using default value 10443


Command (m for help): t <<= 생성한 파티션의 id를 선택하기 위해 입력

Selected partition 1

Hex code (type L to list codes): L <<= 타입 리스트 확인


 0  Empty           24  NEC DOS         81  Minix / old Lin bf  Solaris

 1  FAT12           39  Plan 9          82  Linux swap / So c1  DRDOS/sec (FAT-

 2  XENIX root      3c  PartitionMagic  83  Linux           c4  DRDOS/sec (FAT-

 3  XENIX usr       40  Venix 80286     84  OS/2 hidden C:  c6  DRDOS/sec (FAT-

 4  FAT16 <32M      41  PPC PReP Boot   85  Linux extended  c7  Syrinx

 5  Extended        42  SFS             86  NTFS volume set da  Non-FS data

 6  FAT16           4d  QNX4.x          87  NTFS volume set db  CP/M / CTOS / .

 7  HPFS/NTFS       4e  QNX4.x 2nd part 88  Linux plaintext de  Dell Utility

 8  AIX             4f  QNX4.x 3rd part 8e  Linux LVM       df  BootIt

 9  AIX bootable    50  OnTrack DM      93  Amoeba          e1  DOS access

 a  OS/2 Boot Manag 51  OnTrack DM6 Aux 94  Amoeba BBT      e3  DOS R/O

 b  W95 FAT32       52  CP/M            9f  BSD/OS          e4  SpeedStor

 c  W95 FAT32 (LBA) 53  OnTrack DM6 Aux a0  IBM Thinkpad hi eb  BeOS fs

 e  W95 FAT16 (LBA) 54  OnTrackDM6      a5  FreeBSD         ee  GPT

 f  W95 Ext'd (LBA) 55  EZ-Drive        a6  OpenBSD         ef  EFI (FAT-12/16/

10  OPUS            56  Golden Bow      a7  NeXTSTEP        f0  Linux/PA-RISC b

11  Hidden FAT12    5c  Priam Edisk     a8  Darwin UFS      f1  SpeedStor

12  Compaq diagnost 61  SpeedStor       a9  NetBSD          f4  SpeedStor

14  Hidden FAT16 <3 63  GNU HURD or Sys ab  Darwin boot     f2  DOS secondary

16  Hidden FAT16    64  Novell Netware  af  HFS / HFS+      fb  VMware VMFS

17  Hidden HPFS/NTF 65  Novell Netware  b7  BSDI fs         fc  VMware VMKCORE

18  AST SmartSleep  70  DiskSecure Mult b8  BSDI swap       fd  Linux raid auto

1b  Hidden W95 FAT3 75  PC/IX           bb  Boot Wizard hid fe  LANstep

1c  Hidden W95 FAT3 80  Old Minix       be  Solaris boot    ff  BBT

1e  Hidden W95 FAT1

Hex code (type L to list codes): 8e <<= Linux LVM 타입으로 선택

Changed system type of partition 1 to 8e (Linux LVM)


Command (m for help): w <<= 생성한 테이블 정보를 저장

The partition table has been altered!


Calling ioctl() to re-read partition table.

Syncing disks.



파티션 확인

[root@server /]# fdisk -l


Disk /dev/xvda: 21.5 GB, 21474836480 bytes

255 heads, 63 sectors/track, 2610 cylinders

Units = cylinders of 16065 * 512 = 8225280 bytes

Sector size (logical/physical): 512 bytes / 512 bytes

I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk identifier: 0x0009458d


    Device Boot      Start         End      Blocks   Id  System

/dev/xvda1   *           1         131     1048576   83  Linux

Partition 1 does not end on cylinder boundary.

/dev/xvda2             131         392     2097152   82  Linux swap / Solaris

Partition 2 does not end on cylinder boundary.

/dev/xvda3             392        2611    17824768   83  Linux


Disk /dev/xvdb: 85.9 GB, 85899345920 bytes

255 heads, 63 sectors/track, 10443 cylinders

Units = cylinders of 16065 * 512 = 8225280 bytes

Sector size (logical/physical): 512 bytes / 512 bytes

I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk identifier: 0xd56ebe5a


    Device Boot      Start         End      Blocks   Id  System

/dev/xvdb1               1       10443    83883366   8e  Linux LVM



LV(Logical Volume) 작업 - PV(Pysical Volume) 생성

[root@server /]# pvcreate /dev/xvdb1


Physical volume "/dev/xvdb1" successfully created



LV(Logical Volume) 작업 - PV 생성 확인

[root@server /]# pvscan


PV /dev/xvdb1                      lvm2 [80.00 GiB]

Total: 1 [80.00 GiB] / in use: 0 [0   ] / in no VG: 1 [80.00 GiB]



LV(Logical Volume) 작업 - PV 정보 보기

[root@server /]# pvdisplay


"/dev/xvdb1" is a new physical volume of "80.00 GiB"

--- NEW Physical volume ---

PV Name               /dev/xvdb1

VG Name

PV Size               80.00 GiB

Allocatable           NO

PE Size               0

Total PE              0

Free PE               0

Allocated PE          0

PV UUID               Q3LGAX-jhK4-w6eL-XA3t-Y1Mg-ICP0-IFzBOE



LV(Logical Volume) 작업 - VG(Volume Group) 생성

[root@server /]# vgcreate DataVG /dev/xvdb1


Volume group "DataVG" successfully created



LV(Logical Volume) 작업 - VG 생성 확인

[root@server /]# pvscan


PV /dev/xvdb1   VG DataVG   lvm2 [80.00 GiB / 80.00 GiB free]

Total: 1 [80.00 GiB] / in use: 1 [80.00 GiB] / in no VG: 0 [0   ]



LV(Logical Volume) 작업 - VG 정보 보기

[root@server /]# vgdisplay


--- Volume group ---

VG Name               DataVG

System ID

Format                lvm2

Metadata Areas        1

Metadata Sequence No  1

VG Access             read/write

VG Status             resizable

MAX LV                0

Cur LV                0

Open LV               0

Max PV                0

Cur PV                1

Act PV                1

VG Size               80.00 GiB

PE Size               4.00 MiB

Total PE              20479

Alloc PE / Size       0 / 0

Free  PE / Size       20479 / 80.00 GiB

VG UUID               7aEQ4r-ecmp-1S5r-mcId-YIFB-aLXf-CLSTJc



LV(Logical Volume) 작업 - LV(Logical Volume) 생성

[root@server /]# lvcreate -L 80g -n Data00 DataVG


Volume group "DataVG" has insufficient free space (20479 extents): 20480 required.

[root@server /]# lvcreate -l 20479 -n Data00 DataVG


Logical volume "Data00" created



LV(Logical Volume) 작업 - LV 정보 보기

[root@server /]# lvdisplay


--- Logical volume ---

LV Path                /dev/DataVG/Data00

LV Name                Data00

VG Name                DataVG

LV UUID                NiQ37f-ilLm-m5iE-JNEl-UBP1-eNJt-mgQA7r

LV Write Access        read/write

LV Creation host, time VM1495178951968.localdomain, 2018-09-18 22:02:07 +0900

LV Status              available

# open                 0

LV Size                80.00 GiB

Current LE             20479

Segments               1

Allocation             inherit

Read ahead sectors     auto

- currently set to     256

Block device           253:0



파일 시스템 생성

[root@server /]# mkfs.ext3 /dev/DataVG/Data00


mke2fs 1.41.12 (17-May-2010)

Filesystem label=

OS type: Linux

Block size=4096 (log=2)

Fragment size=4096 (log=2)

Stride=0 blocks, Stripe width=0 blocks

5242880 inodes, 20970496 blocks

1048524 blocks (5.00%) reserved for the super user

First data block=0

Maximum filesystem blocks=4294967296

640 block groups

32768 blocks per group, 32768 fragments per group

8192 inodes per group

Superblock backups stored on blocks:

        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,

        4096000, 7962624, 11239424, 20480000


Writing inode tables: done

Creating journal (32768 blocks): done

Writing superblocks and filesystem accounting information: done


This filesystem will be automatically checked every 24 mounts or

180 days, whichever comes first.  Use tune2fs -c or -i to override.


마운트 작업 - 마운트 할 디렉토리 생성

[root@server /]# mkdir /data

마운트 작업 - /dev/DataVG/Data00를 /data에 마운트

[root@server /]# mount /dev/DataVG/Data00 /data


마운트 작업 - 마운트 확인

[root@server /]# mount


/dev/xvda3 on / type ext4 (rw)

proc on /proc type proc (rw)

sysfs on /sys type sysfs (rw)

devpts on /dev/pts type devpts (rw,gid=5,mode=620)

tmpfs on /dev/shm type tmpfs (rw)

/dev/xvda1 on /boot type ext4 (rw)

none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)

none on /proc/xen type xenfs (rw)

sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)

/dev/mapper/DataVG-Data00 on /data type ext3 (rw)

[root@server /]# df -h


Filesystem            Size  Used Avail Use% Mounted on

/dev/xvda3             17G   15G  1.4G  92% /

tmpfs                 1.9G     0  1.9G   0% /dev/shm

/dev/xvda1           1008M   56M  901M   6% /boot

/dev/mapper/DataVG-Data00

                       79G  184M   75G   1% /data



마운트 작업 - /etc/fstab에 마운트 정보 추가

[root@server /]# vi /etc/fstab


#

# /etc/fstab

# Created by anaconda on Wed Mar 16 15:52:09 2016

#

# Accessible filesystems, by reference, are maintained under '/dev/disk'

# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info

#

UUID=cc0565f7-adc2-4995-92d8-03d03830e0b3 /                       ext4    defaults        1 1

UUID=ab5b8d4a-1997-4b82-a764-05dbdf44dac2 /boot                   ext4    defaults        1 2

UUID=5cb8d624-6c99-478d-b05d-566b756ae6a5 swap                    swap    defaults        0 0

tmpfs                   /dev/shm                tmpfs   defaults        0 0

devpts                  /dev/pts                devpts  gid=5,mode=620  0 0

sysfs                   /sys                    sysfs   defaults        0 0

proc                    /proc                   proc    defaults        0 0

/dev/DataVG/Data00 /data ext3 defaults 1 2 <<= 추가한 내용


+ Recent posts