02 A Few Concrete Examples
(몇 가지 구체적인 예제)

Deep Learning은 입력값과 출력값을 맵핑한다. Deep Learning은 상관 관계를 찾는다. 그것은 "Universal Approximator"(보편적인 근사)라고 알려져 있다. 왜냐하면 입력값 x와 출력값 y가 상관 관계나 인과 관계가 있다고 가정할 때, 함수 f(x)=y의 근사치를 계산하는 것을 배울 수 있기 때문이다. 학습 과정에서, 신경망은 f(x)=3x+12인지 f(x)=9x-0.1인지에 상관없이 올바른 f를 찾거나 정확한 방식으로 x를 y로 변환한다. Deep Learning이 무엇을 할 수 있는지 여기 몇가지 예제가 있다.

1. Classification
(분류)

모든 분류 작업은 라벨이 붙여진 데이터셋에 달려 있다. 그것은 곧 사람은 신경망이 라벨과 데이터 사이의 상관 관계를 배우도록 지식을 데이터셋으로 변환해야 한다는 것을 의미한다. 이것을 Supervised Learning(감독 학습)이라고 한다.

  - 얼굴을 감지하고, 이미지에서 사람들을 식별하고, 얼굴 표정을 인식한다. (화가 났는지, 즐거운지)
  - 비디오에서 행동 인식한다.
  - 음성을 감지하고, 화자를 식별하고, 음성을 텍스트로 바꾸고, 음성에서 감정을 인식한다.
  - 텍스트를 스팸(이메일에서)이나 사기(보험 청구에서)로 분류하고 텍스트에서 감정을 인식한다. (고객 피드백)

사람이 만들 수 있는 어떤 라벨이나 관심을 가지고 있는 어떠한 결과, 데이터와 상관 관계가 있는 어떤 라벨이라도 신경망 훈련에 사용할 수 있다.

2. Clustering
(클러스터링)

클러스터링이나 그룹핑은 유사성을 감지한다. Deep Learning은 유사성을 감지하기 위해 라벨을 붙이도록 요구하지 않는다. 라벨을 붙이지 않은 Learning은 "Unsupervised Learning"(감독되지 않는 학습)이라고 한다. 라벨이 붙어 있지 않은 데이터는 전 세계 대부분의 데이터이다. 머신 러닝의 한가지 원칙은 더 많은 데이터로 알고리즘이 학습할수록, 더 정확해질 것이라는 것이다. 그러므로, unsupervised learning은 굉장히 정확한 모델을 생성할 수 있는 잠재력이 있다.

  - 검색 : 유사한 아이템을 나타내기 위하여 문서나 이미지, 사운드를 비교한다.
  - 이상 탐지 : 유사성 탐지와는 반대로 이상 현상이나 비정상적인 행위를 탐지하는 것이다. 많은 경우에, 비정상적인 행위는 사기와 같이 탐지하고 방지하기 원하는 것과 높은 상관 관계가 있다.

3. Predictive Analytics
(예측 분석)

말하자면, 분류를 통해서 deep learning은 이미지의 픽셀과 사람의 이름 사이의 상관 관계를 설정할 수 있다. 이것을 정적 예측이라고 부를 수 있다. 동일한 토큰으로, 충분한 올바른 데이터에 노출된다면 deep learning은 현재 이벤트와 미래 이벤트 사이의 상관 관계를 설정할 수 있다. 미래 이벤트는 감각에 라벨을 붙이는 것과 같다. Deep learning은 시간이나 어떤 일이 아직 발생하지 않았다는 사실을 반드시 고려하지는 않는다. 주어진 일련의 시간 동안, deep learning은 숫자열을 읽고, 다음에 발생할 것 같은 최적의 숫자를 예측한다.

  - 하드웨어 고장 : 데이터 센터, 제조, 운송
  - 건강 이상 : 뇌졸중, 생체 통계와 웨어러블 데이터 기반 심장 마비
  - 고객 변동(churn:서비스 제공자를 바꾸는 고객) : 웹 활동이나 메타데이터에 근거한 고객이 떠날 가능성 예측
  - 직원 이직율 : 위와 동일하지만, 직원용으로

더 잘 예측할수록, 더 잘 예방하고 미연에 방지할 수 있다. 보는 것과 같이, 신경망을 가지고 우리는 더 적은 놀라움의 세상을 향해 움직일 수 있다. Zero가 아닌 단지 미미하게 더 적은 놀라움의 세상으로.

Deep Learning Use Case에 대한 간략한 Overview를 통해서, 신경망이 무엇으로 이루어져 있는지를 살펴보자.
받은 트랙백이 없고, 댓글이 없습니다.

댓글+트랙백 RSS :: http://www.yongbi.net/rss/response/787


more..



01. Neural Network Definition
(신경망의 정의)

신경망은 패턴을 인식하도록 디자인된 사람의 뇌를 본떠 느슨하게 모델링된 일련의 알고리즘이다. 신경망은 기계 인식, 원시 입력값을 라벨링하거나 클러스터링하는 것을 통해 감각 데이터를 해석한다. 신경망이 인식한 패턴들은 모든 실제 세상의 데이터-이미지, 사운드, 텍스트, 시간 계열-가 번역되어 벡터에 포함된 수치들이다.

신경망은 클러스터링하고 분류하는데 도움을 준다. 신경망은 저장하고 관리하는 데이터 위에서 클러스터링하고 분류하는 계층으로 생각할 수 있다. 신경망은 예제로 입력하는 값들 사이의 유사성에 따라 라벨이 붙어 있지 않은 데이터를 그룹하는데 도움을 준다. 그리고, 라벨이 붙여진 데이터를 가지고 있다면 분류하여 훈련할 수 있다. (더 정확하게 이야기하면, 신경망은 클러스터링하고 분류하기 위해 다른 알고리즘에 있는 기능들을 추출한다. 따라서 심층 신경망(Deep Neural Networks)은 강화 학습, 분류 및 회귀 알고리즘을 포함한 더 커다란 머신러닝 어플리케이션의 컴포넌트로 생각할 수 있다.)

Deep Learning(심화 학습)으로 풀 수 있는 문제들은 무엇이 있으며, 더 중요한 것은 Deep Learning으로 여러분의 어떤 문제들을 해결할 수 있는가? 그에 대한 답을 알기 위해서는 스스로에게 몇 가지 질문을 해볼 필요가 있다. 내가 관심을 가지고 있는 결과는 무엇인가? 그런 결과들은 데이터로 적용될 수 있는 라벨들이다. 예를 들면, 이메일 필터의 스팸인지 아닌지, 사기 탐지의 좋은 사람인지 나쁜 사람인지, 고객 관계 관리(CRM)상에서의 화난 고객인지, 행복한 고객인지. 그런 다음 물어보라. 이 라벨에 동반되는 데이터를 가지고 있는가? 곧, 라벨이 붙여진 데이터를 찾을 수 있는가? 또는 라벨과 입력값 사이의 상관 관계를 알고리즘에 가르쳐 주기 위해 스팸이라는 라벨이 붙여진 스팸과 같이 라벨이 붙여진 데이터들(Mechanical Turk이나 Crowdflower와 같은 서비스를 사용하여)을 만들 수 있는가?

받은 트랙백이 없고, 댓글이 없습니다.

댓글+트랙백 RSS :: http://www.yongbi.net/rss/response/786

Interaction Styles
(상호작용 형태)

서비스에 대한 IPC 메커니즘을 고르느느 경우, 서비스가 어떻게 상호작용 하는지를 먼저 생각보면 유용하다. Client와 서비스간 상호 작용 형태는 다양하다. 2가지 관점에 따라 카테고리지어질 수 있다. 첫번째 관점은 상호작용이 one-to-one 인지, one-to-many 인지에 대한 것이다.
 
  - One-to-one : Client의 각 요청은 정확하게 하나의 서비스 인스턴스에 의해 처리된다.
  - One-to-many : 각 요청은 여러 서비스 인스턴스에 의해 처리된다.

두번째 관점은 상호작용이 Syncronous(동기)인지 Asynchronous(비동기)인지에 대한 것이다.

  - Synchronous : Client는 서비스로부터 시기적절한 응답을 기대하고, 기다리는 동안은 대기한다.
  - Asynchronous : Client는 응답을 기다리는 동안 대기하지 않는다. 그리고 만약에 있다면 즉시 응답을 보낼 필요가 없다.

다음 표는 다양한 상호작용 형태를 보여준다.

 One-to-OneOne-to-Many
SynchronousRequest/Response-
AsynchronousNotificationPublish/Subscribe
Request/Async ResponsePublish/Async Responses

One-to-One 상호작용에는 다음과 같은 종류가 있다.

  - Request/Response : Client는 서비스로 요청을 보내고, 응답을 기다린다. Client는 시기 적절하게 응답을 받을 수 있기를 기대한다. Thread기반 어플리케이션에서는 thread가 요청을 하고, 기다리는 동안 대기하고 있을 것이다.
  - Notification (단방향 요청으로도 알려짐): Client는 비동기적으로 응답하는 서비스로 요청을 보낸다. Client는 기다리는 동안 대기하지 않는다. 그리고 얼마 동안은 응답이 도착하지 않는다고 가정하고 설계된다.

One-to-Many 상호작용에는 다음과 같은 종류가 있다.

  - Publish/Subscribe : Client는 0개 이상의 관련된 서비스에서 소비되는 Notification message를 발행한다.
  - Publish/Async Responses : Client는 요청 메시지르르 발행하고, 관련된 서비스로부터의 응답을 정해진 시간 동안 기다린다.

각 서비스는 일반적으로 이러한 상호작용 형태를 조합하여 사용한다. 어떤 서비스들에 대해서는 하나의 IPC 메커니즘으로도 충분하다. 다른 서비스들은 IPC 메커니즘의 조합을 사용하는 것이 필요하다. 다음 다이어그램은 택시 호출 어플리케이션에서 사용자들이 이동을 요청했을 때, 어떻게 서비스들이 상호작용 하는지를 보여준다.

사용자 삽입 이미지


서비스들은 Notification, request/response, publish/subscribe를 조합하여 사용한다. 예를 들면, 승객의 스마트폰은 pickup을 요청하기 위해 Trip Management Service에 Notification을 보낸다. Trip Management Service는 Passenger Service를 호출하기 위해서 request/response를 사용하여 승객의 계정이 활성화되어 있는지 검증한다. 그리고 나서 Trip Management Service는 택시호출을 생성하고, Dispatcher(차량 배치 담당 서비스)를 포함하여 가용가능한 운전사 위치를 다른 서비스들에게 알리기 위해 publish/subscribe를 사용한다.

지금까지 우리는 상호작용 형태에 대해서 살펴보았는데, 이제 어떻게 API를 정의하는지에 대해서 알아보자.
받은 트랙백이 없고, 댓글이 없습니다.

댓글+트랙백 RSS :: http://www.yongbi.net/rss/response/759

Summary

대부분의 microservice기반 어플리케이션에 대해서 시스템으로 접근하는 단일 접점 포인트로 동작하는 API Gateway를 구현하는 것이 좋다. API Gateway는 request routing(요청 전송), composition(구성), protocol translation(프로토콜 변환)에 대해 책임을 진다. API Gateway는 어플리케이션의 각 client에 Custom API를 제공한다. API Gateway는 또한 캐시되어 있는 데이터나 기본 데이터를 리턴하여 backend service의 실패를 감출 수 있다. 시리즈의 다음 article에서는 서비스들 사이의 통신에 대해서 살펴볼 것이다.
받은 트랙백이 없고, 댓글이 없습니다.

댓글+트랙백 RSS :: http://www.yongbi.net/rss/response/757

Implementing an API Gateway

이제, API Gateway를 사용하는 것에 대한 동기부여와 trade-off(서로 대립되는 요소 사이의 균형점)에 대해서 살펴봤는데, 이제 고려해야할 다양한 디자인 이슈에 대해서 살펴보자.

Performance and Scalability
(성능과 확장성)

단지 몇개의 회사만 Netflix의 규모로 운영되고 있고, 하루에 수십억건의 요청을 처리할 필요가 있다. 그러나, 일반적으로 API Gateway의 성능과 확장성은 대부분의 어플리케이션에서 매우 중요하다. 그러므로 플랫폼에서 Asynchronous, Non-blocking I/O를 지원하는 API Gateway 만드는 것이 필요하다. 확장 가능한 API Gateway를 구현하기 위해 사용하는 기술들은 다양하다. JVM상에서 Netty, Vertx, Spring Reactor, JBoss Undertow와 같은 NIO(Non-Blocking I/O) 기반 framework를 사용할 수도 있다. 일반적으로 Chrome의 Javascript engine인  Node.js도 non-JVM 기반의 한가지 선택이 될 수 있다. 또다른 선택은 NGINX PLUS를 사용하는 것이다. NGINX PLUS는 성숙하고 확장 가능하며 고성능의 웹 서버와 쉽게 배포할 수 있고, 설정 가능하고, 프로그램될 수 있는 reverse proxy를 제공한다. NGINX PLUS는 authentication(인증), access control(접근제어), load balancing requests(요청 부하 분산), caching responses(응답 캐싱), 어플리케이션을 인식하는 health check와 모니터링을 관리할 수 있다.

Using a Reactive Programming Model
(반응 프로그래밍 모델 사용:이벤트를 비동기 데이터 흐름으로 보는 프로그래밍 방법)

API Gateway는 어떤 요청들에 대해서는 간단히 적합한 backend service로 전달한다. 다른 요청들에 대해서는 여러 개의 backend service를 호출하고, 그 결과를 취합한다. 상품 상세 정보 요청과 같은 어떤 요청들은 서로 독립적인 backend service에 요청하기도 한다. 응답 시간을 최소화하기 위하여, API Gateway는 동시에 독립적으로 요청을 처리해야 한다. 그러나, 때때로 요청 사이에는 의존 관계가 있다. API Gateway는 요청을 backend service로 전달하기 전에, 처음에 authentication service(인증 서비스)를 호출하여 요청에 대해 인증할 필요가 있다. 이와 유사하게, 고객의 wish list에서 상품에 대한 정보를 가져오려고 할 때, API Gateway는 먼저 정보를 담고 있는 고객의 프로파일을 조회하고, 각 상품에 대한 정보를 조회해야만 한다. API composition(구성)의 또다른 흥미로운 예제는 Netflix Video Grid이다.

전통적인 asynchronous callback approach로 API composition code를 작성하면, 여러분은 빠르게 callback hell에 빠지게 된다. Code는 꼬이고, 이해하기 어렵고, 오류가 발생하기 쉽다. 더 좋은 방법은 reactive approach를 사용하여 서술 형태로 API Gateway Code를 작성하는 것이다. Scala의 Future, Java 8의 CompletableFuture, Javascript의 Promise가 reactive abstraction의 예이다. 물론, .ㅜNET Platform을 위해서 Microsoft에서 개발한 Reactive Extension(Rx or ReactiveX라고도 불린다.)도 있다. Netflix는 그들의 API Gateway에서 특별하게 사용하기 위해 JVM에 대한 RxJava를 만들었다. 물론 브라우저와 Node.js에서 모두 동작하는 Javascript를 위한 RxJS도 있다. Reactive approach를 사용하면 API Gateway code를 굉장히 효율적으로 작성할 수 있을 것이다.

Service Invocation
(서비스 호출)

Microservice기반 어플리케이션은 분산 시스템이기 때문에 inter-process communication mechanism(프로세스간 통신 매커니즘)을 사용해야만 한다. Inter-process communication에는 2가지 형태가 있다. 한가지는 비동기 메시지 기반 메커니즘을 사용하는 것이다. JMS나 AMQP와 같은 message broker를 사용하여 구현한다. 나머지는 ZEROMQ처럼, broker 없이 서비스들이 직접 통신하는 메커니즘이다. 또다른 inter-process communication 형태는 HTTP나 Thrift와 같은 비동기 메커니즘이다. 시스템은 동기, 비동기 모두 사용할 수도 있고, 각각의 형태의 여러 구현체들을 사용할 수도 있다. 따라서, API Gateway는 다양한 통신 매커니즘을 지원해야 한다.

Service Discovery
(서비스 발견)

API Gateway는 통신할 각 microservce들의 위치(IP 주소와 port)를 알고 있어야 한다. 고전적인 어플리케이션에서는 위치를 고정시켰으나, cloud기반 microservice 어플리케이션인 현대에는 심각한 문제이다. Message broker와 같은 기초적인 서비스는 OS 환경 변수를 통해 특정지을 수 있는 고정 주소를 가지고 있을 것이다. 그러나, application service의 위치를 결정하는 것은 그렇게 쉽지 않다. Application service는 동적으로 지정된 주소를 가지고 있다. 또한, service의 여러 instance들은 autoscaling과 upgrade때문에 동적으로 변한다. 따라서, 시스템에서 다른 서비스의 클라이언트와 같은 API Gateway는 시스템의 서비스를 발견하는 메커니즘을 사용해야 한다. 그것이 Server-side Discovery이건 Client-side Discovery이건 간에. 나중에 service discovery에 대해서는 더 자세히 다룰 것이다. 우선은 시스템이 Client-Side Discovery를 사용한다면 API Gateway가 모든 microservice instance들과 그 위치에 대한 데이터베이스인 Service Registry에 질의할 수 있어야 하는 것에 대해서 기록할만한 가치가 있다.

Handling Partial Failures
(부분적인 실패 처리)

API Gateway를 구현할 때 고민해야할 또다른 이슈는 부분적인 실패에 대한 문제이다. 이 이슈는 하나의 서비스가 또다른 서비스를 호출할 때, 느리게 응답하거나 사용불가능한 경우, 언제든지 모든 분산 시스템에서 발생한다. API Gateway는 downstream service(API Gateway에서 요청을 전송한 서비스)에 대해서 무한대로 기다리며 차단하지 않아야 한다. 그러나, 특정 시나리오에서 발생하는 실패와 서비스가 실패하는 경우는 어떻게 다루어야 하는가? 예를 들면 상품 상세 정보 시나리오에서 추천 서비스가 응답하지 않는다면, API Gateway는 아직 사용자가 사용중이기 때문에 client에 나머지 상품 상세 정보를 보내 주어야 한다. 추천 내용은 비어 있거나, 예를 들어 고정된 top 10 리스트 같은 내용으로 교체될 것이다. 그러나 만약 상품 정보 서비스가 응답을 하지 못하는 상황이라면 API Gateway는 client에 에러를 리턴해야 한다.

API Gateway는 캐시를 사용할 수 있도록 되어 있을 경우, 캐시된 데이터를 리턴할 수도 있다. 예를 들어 상품 가격이 수시로 변경될 경우 API Gateway는 상품 가격 서비스를 이용할 수 없을 경우, 캐시된 상품 가격 데이터를 리턴할 수 있다. 데이터는 API Gateway 자체에 캐시되거나 Redis, Memcached와 같은 외부 캐시에 저장될 수 있다. 기본 데이터나 캐시 데이터를 리턴하여 API Gateway는 시스템에서 발생한 실패가 사용자 경험에 영향을 미치지 않도록 한다.

Netflix Hystrix는 remote service를 호출하는 code를 작성하는데 믿을 수 없을 정도로 유용한 라이브러리이다. Hystrix는 특정 한계점을 넘어서는 호출을 중지시킨다. Circuit breaker pattern으로 구현되었는데, 응답하지 않는 서비스에 대해서 client가 불필요하게 기다리는 것을 멈추게 한다. 만약 서비스의 error rate가 특정 한계점을 넘어간다면, Hystrix는 circuit breaker를 작동시키고, 모든 요청들은 즉시 특정 기간동안 실패할 것이다. Hystrix는 캐시를 읽거나 기본값을 리턴하는 것과 같은 요청이 실패할 때, callback action을 정의할 수 있다. 만약 JVM을 사용한다면 Hystrix를 사용하는 것을 분명히 고려해 보라. 만약 non-JVM 환경에서 구동시키고 있다면, 동등한 라이브러리를 사용해야 한다.
받은 트랙백이 없고, 댓글이 없습니다.

댓글+트랙백 RSS :: http://www.yongbi.net/rss/response/756