머신러닝은 어떤 데이터로 어떤 학습 알고리즘을 사용할 것인가를 결정하는 작업이라고 할수 있다. 여기서 문제가 될수 있는 나쁜 알고리즘과 나쁜 데이터에 대해 알아보도록 하자.

충분하지 않은 데이터

어린아이에게 사과에 대해 알려주려면 사과를 가리키면서 ‘사과’라고 말하기만 하면 된다(아마도 이 과정을 여러 번 반복해야 하겠지만..). 그러면 아이는 결국 색깔과 모양이 달라도 모든 종류의 사과를 구분할 수 있게 된다. 하지만 머신러닝에서 사과를 구분할 수 있도록 알고리즘이 잘 작동하려면 데이터가 많아야 한다. 아주 간단한 문제에서 조차도 수천 개의 데이터가 필요하고 이미지나 음성 인식 같은 복잡한 문제라면 수백만 개가 필요할지도 모른다.

“It’s not who has the best algorithm that wins. It’s who has the most data”

AI 전문가이자 스탠포드 교수인 앤듀르 응(Andrew Ng)의 말이다. 정교한 알고리즘을 설계하는 것 이상으로 많은 데이터를 이용하는 것이 효과적이다. 정교한 알고리즘과 많은 데이터가 가장 정확한 결과를 얻을 수 있겠지만, 시간과 돈을 알고리즘 개발에 쓰는 것과 데이터를 잘 활용하는것 사이의 트레이드 오프에 대해 다시한번 생각해 봐야 한다는 것이다.


(참고 논문 : 믿을 수 없는 데이터의 효과 http://goo.gl/KNZMEA)

대표성 없는 학습 데이터

일반화가 잘되려면 우리가 일반화하기 원하는 새로운 사례를 학습 데이터가 잘 대표하는 것이 중요하다. 대표성을 가지는 데이터를 사용하는 것이 가장 좋지만, 결코 쉬운일은 아니다. 샘플이 작으면 샘플링 잡음(Sampling Noise)이 생기고, 표본 추출 방법이 잘못되면 대표성을 띄지 못할 수 있다. 이를 샘플링 편향(Sampling Bias)이라고 한다.

샘플링 편향 사례

샘플링 편향에 대한 유명한 사례중 랜던(Randon)과 루즈벨트(Roosevelt)가 경쟁했던 1936년 미국 대통령 선거에서 Literary Digest 잡지사가 천만 명에게 우편물을 보내 수행한 대규모 여론조사가 있다. 그 당시 240만 명의 응답을 받았고 랜던이 선거에서 57% 득표를 얻을 것이라고 높은 신뢰도로 예측했지만, 루즈벨트가 62% 득표로 당선되었다. 문제는 Literary Digest의 샘플링 방법에 있었다고 한다.

첫째, 여론조사용 주소를 얻기 위해 전화번호부, 자사의 구독자 명부, 클럽 회원 명부 등을 사용했다. 이런 명부는 모두 공화당(따라서 랜던)에 투표할 가능성이 높은 부유한 계층에 편중된 경향이 있다.

둘째, 우편물 수신자 중 25% 미만의 사람이 응답했다. 이는 정치에 관심 없는 사람, Literary Digest를 싫어하는 사람과 다른 중요한 그룹을 제외시킴으로써 역시 표본을 편향되게 만들게 된 것이다. 특히 이러한 종류의 샘플링 편향을 비응답 편향(nonresponse bias)이라고 한다.

낮은 품질의 데이터

학습 데이터가 에러, 이상치, 잡음으로 가득하다면 머신러닝 시스템이 내재되어 있는 패턴을 찾기 어려울 수 있다. 그 만큼 데이터의 전처리가 매우 중요하다. 한 설문조사에서는 데이터과학자의 80% 시간을 데이터 수집 및 전처리에 사용한다고 한다. 아마도 전처리 과정은 특히나 지루하고 반복 작업의 연속이라 고단하고 시간도 많이 들어어가게 된다.

관련 없는 특성

학습 데이터에 관련 없는 특성이 적고 관련 있는 특성이 충분해야 학습을 진행할 수 있다. 훈련에 사용할 좋은 특성들을 찾아야 하며, 특성을 찾기 위해서는 아래 사항을 고려 해야 한다.


  • 특성 선택 (Feature Selection) : 가지고 있는 특성 중에서 학습에 가장 유용한 특성을 선택.
  • 특성 추출 (Feature Extraction) : 특성을 결합하여 더 유용한 특성을 만듬. 혹은 새로운 데이터를 수집하여 새로운 특성을 만듬.

지금까지 나쁜 데이터의 사례를 살펴보았고 이제 나쁜 알고리즘의 경우를 살펴보자.

학습 데이터의 과대적합

모델이 학습 데이터에 너무 잘 맞지만 일반성이 떨어진다는 의미이다. 훈련 데이터에 있는 잡음의 양에 비해 모델이 너무 복잡할 때 발생하기 때문에 좀더 단순화 시킬 필요가 있다.


  • 파라미터 수가 적은 모델 선택, 훈련데이터에 특성수를 줄임, 모델에 제약을 가하여 단순화
  • 훈련 데이터를 더 많이 모음
  • 훈련 데이터의 잡음을 줄임

학습 데이터 과소적합

모델이 너무 단순해서 데이터의 내재된 구조를 학습하지 못한것을 의미한다.


  • 파라미터가 더 많은 강력한 모델 선택
  • 더 좋은 특성 제공(특성 엔지니어링)
  • 모델의 제약을 줄임(규제 하이퍼파라미터를 감소)


좋은 모델을 만들기 위해서는 테스트와 검증이 필요하다. 이는 일반화 오류를 최소화 하기위한 방법이기도 하다. 일반적으로 모델을 만들기 위해서는 데이터를 훈련셋, 검증셋, 테스트셋으로 나누어 학습을 진행을 한다. 검증셋을 이용해 적합한 모델을 찾고 테스트셋을 이용해 최종 점검을 하여 최적의 하이퍼파라미터 셋팅하기 위함이다.


마치며…

“Big Data is the next Natural Resource…“

과거 원유가 가장 중요한 자원이었다고 한다면 이제는 데이터가 가장 중요한 자원일 것이다. 그런데 데이터는 과거의 자원들과는 아주 많이 다르다. 데이터는 지속적인 재생, 고갈되지 않는.. 그리고 스스로 증폭하는 새로운 자원이다. 앞으로는 이렇게 중요한 데이터를 올바르게 잘 활용을 하는것이 정말 중요할 것이다.

참고한 자료

강연 : 4차 산업혁명시대 어떻게 살 것인가? - EBS 미래강연Q

도서 : Hands-On Machine Learning - 한빛미디어



Posted by @위너스

댓글을 달아 주세요

[FCM] #1. 소개 및 메시지

[FCM] #2. Firebase 프로젝트 생성 및 Android 앱 FCM 설정

[FCM] #3. Firebase 메시지 전송

[FCM] #4. Android 메시지 처리




일반적인 FCM(Firebase Cloud Message) 발송은 앱 서버에서 FCM 서버로 메시지 요청을 보내고, FCM 서버에서는 다시 클라이언트 기기 앱에 메시지를 보낸다. 


#2에서는 FCM 서버에서 클라이언트 기기로 수신되도록 세팅을 하였다. 

이번 #3에서는 앱 서버에서 FCM 서버로 메시지 요청을 보내는 방법에 대해서 알아본다. 


FCM 서버로 전송하는 방법으로는 크게 3가지 구분된다. 


1. Firebase Admin SDK 이용

2. HTTP V1 API 이용

3. 기존 HTTP API 이용


각 전송 방법 별로 가능한 수신 분류에 대해 정리하였다. 

 

단일 기기

멀티캐스트

(여러 기기)

기기 그룹 

주제 구독 

 Firebase Admin SDK

O

X

X

 HTTP V1 API

O

X

O

 기존 HTTP API

O

O

O

추가로 #2에서 Android Studio에서 기기 그룹이나 주제 구독에 대한 처리를 하지 않았으므로 단일 기기로만 발송테스트를 진행한다. 


Firebase Admin SDK로 발송 

Firebase Admin SDK를 사용하면 자체 백엔드 서비스를 Firebase 클라우드 메시징(FCM)과 통합할 수 있습니다. 
Admin FCM API는 Firebase 서버 인증을 처리하는 동시에 메시지 보내기와 주제 구독 관리를 지원합니다.

위 소개글에 보면 주로 백엔드 관리툴에서 테스트 형태로 사용할 수 있다는 의미인거 같다.  사실 3가지 방법 중 가장 심플한 방법으로 백엔드 관리툴에 붙여도 된다. 

환경설정 및 초기화

Admin SDK를 사용하려면, 아래 3가지 방법 중 하나를 사용해야 한다. 
- projectId Firebase 앱 옵션을 명시적으로 지정합니다.

서비스 계정 사용자 인증 정보로 SDK를 초기화합니다.

- GCLOUD_PROJECT 환경 변수를 설정합니다.

우리는 서비스 계정 사용자 인증 정보로 SDK 초기화 사용한다. 


먼저 사용해야할 비공개 키를 발급받는다.


Firebase 콘솔에서 설정>서비스계정에 들어가면 새 비공개 키 생성 이라는 버튼이 보인다. 


문구에서도 나와 있듯이 공개 저장소에는 넣지 말자.

추가로 json 파일은 내용을 열어서 확인해 보면 좋다. 

프로젝트 관련 비밀키 및 환경 정보들이 들이있다. 


각자 자바 프로젝트 생성하자.

다운로드를 받은 json 파일을 넣자. 

본인은 기본 클래스패스인 resource에 넣었다. 


종속성도 처리하자. 본인은 maven을 사용하므로 pom.xml에 종속성을 추가하였다. 


  com.google.firebase
  firebase-admin
  6.4.0

이제 SDK 초기화 코드를 넣어 보자.

InputStream serviceAccount = null;
FirebaseOptions options = null;
try {
    ClassPathResource resource = new ClassPathResource("fcmmsg.json");
    serviceAccount = resource.getInputStream();
    options = new FirebaseOptions.Builder()
        .setCredentials(GoogleCredentials.fromStream(serviceAccount))
        .build();
    FirebaseApp.initializeApp(options, "fcmmgs");
} catch (FileNotFoundException e) {
    logger.error("Firebase ServiceAccountKey FileNotFoundException" + e.getMessage());
} catch (IOException e) {
    logger.error("FirebaseOptions IOException" + e.getMessage());
}

이것으로 Admin SDK 설정 및 초기화가 완료 되었다. 

추가 정보는 https://firebase.google.com/docs/admin/setup?authuser=0#initialize_the_sdk 여기를 참조하자. 

전송

개별 기기로 전송하는 부분을 추가한다.  
Notification notification = new Notification("타이틀","내용");

Message message = Message.builder()
.putData("score", "850")
.putData("time", "2:45")
.setToken("기기토큰정보")
.setNotification(notification)
.build();

String response = null;
try {
    response = FirebaseMessaging.getInstance(FirebaseApp.getInstance("fcmmsg")).send(message );
} catch (FirebaseMessagingException e) {
    logger.error("Firebase FirebaseMessagingException" + e.getMessage());
    e.printStackTrace();
}

추가 정보는 https://firebase.google.com/docs/cloud-messaging/admin/send-messages?authuser=0 여기를 참조하자.


에뮬레이터로 확인해 보면 메시지가 온 것을 확인할 수 있다. 

HTTP V1 API 발송

기존 HTTP API 보다 액세스 토큰을 통한 보안 향상, 확장성 강화, 메시지 맞춤설정 등 장점이 많다.
HTTP API는 발송하는 서버키 값이 고정인데 반해 HTTP V1은 발송하는 서버키 값을 엑세스 토큰으로 받아서 사용하는 부분이 다르다. 
하지만 멀티캐스트 메시징을 지원하지 않아 아직까지는 기존 HTTP API를 많이 사용한다. 

환경설정 및 초기화

본인은 http 플로그인을 okhttp를 사용하기 위에 종속성을 추가하였다. 


 com.squareup.okhttp3
 okhttp
 3.9.1

HTTP V1 API를 사용하기 위해 초기화 코드를 넣는다. 

GoogleCredential googleCredential = null;
InputStream serviceAccount = null;
String SCOPES = "https://www.googleapis.com/auth/firebase.messaging";
try {
    ClassPathResource resource = new ClassPathResource("fcmmsg.json");
    serviceAccount = resource.getInputStream();
    googleCredential = GoogleCredential
            .fromStream(serviceAccount)
            .createScoped(Arrays.asList(SCOPES));
} catch (IOException e) {
    e.printStackTrace();
}
알림 메시지 구조
아래 정보는 알림메시지 샘플데이터다. 
기존 HTTP 알림메시지와는 조금 다르다. 
{
  "message": {
    "token": "bk3RNwTe3H0:CI2k_...",
    "notification": {
      "title": "Breaking News",
      "body": "New news story available."
    },
    "data": {
      "story_id": "story_12345"
    }
  }
}
//com.google.gson 사용
JsonObject jsonObj = new JsonObject();
jsonObj.addProperty("token", "토큰정보");
JsonObject notification = new JsonObject();
notification.addProperty("body", "\uD83D\uDE03바디V1");
notification.addProperty("title", "\uD83D\uDE03타이틀V1");
jsonObj.add("notification", notification);
JsonObject message = new JsonObject();
message.add("message", jsonObj);

전송

요청할 URL은 아래와 같다. 
https://fcm.googleapis.com/v1/projects/프로젝트ID/messages:send
Firebase 콘솔로 들어가서 프로젝트 ID는 설정>일반 메뉴에서 볼 수 있다. 


전송 코드를 추가한다. 

추가 정보는 https://firebase.google.com/docs/cloud-messaging/migrate-v1?authuser=0 여기를 참조하자.


final MediaType mediaType = MediaType.parse("application/json");
OkHttpClient httpClient = new OkHttpClient();
try {

    Request request = new Request.Builder().url("https://fcm.googleapis.com/v1/projects/fcmmsg/messages:send")
        .addHeader("Content-Type", "application/json; UTF-8")
        .addHeader("Authorization", "Bearer " + googleCredential.getAccessToken())
        .post(RequestBody.create(mediaType, message.toString())).build();
    Response response = httpClient.newCall(request).execute();
    logger.info("Successfully sent message: " + response);
} catch (IOException e) {
    logger.error("Error in sending message to FCM server " + e);
}

에뮬레이터로 확인해 보면 메시지가 온 것을 확인할 수 있다. 

기존 HTTP API 발송

아직 많이 사용하고 있는 방식이다. 

메시지 가공 및 발송


//메시지 가공
JsonObject jsonObj = new JsonObject();
//token
Gson gson = new Gson();
JsonElement jsonElement = gson.toJsonTree("등록토큰");
jsonObj.add("to", jsonElement);
//Notification
JsonObject notification = new JsonObject();
notification.addProperty("title", "\uD83D\uDE03타이틀HTTP");
notification.addProperty("body", "\uD83D\uDE03바디HTTP");
jsonObj.add("notification", notification);

/*발송*/
final MediaType mediaType = MediaType.parse("application/json");
OkHttpClient httpClient = new OkHttpClient();
try {
    Request request = new Request.Builder().url("https://fcm.googleapis.com/fcm/send")
        .addHeader("Content-Type", "application/json; UTF-8")
        .addHeader("Authorization", "key=" + "서버키값")
        .post(RequestBody.create(mediaType, jsonObj.toString())).build();
    Response response = httpClient.newCall(request).execute();
    String res = response.body().string();
    logger.info("notification response " + res);
} catch (IOException e) {
    logger.info("Error in sending message to FCM server " + e);
}
등록토큰은 기기 토큰 값을 넣어준다.

서버키값은 Firebase 콘솔에 가서 설정>클라우드 메시징에 가면 정보가 있다. 

알림메시지 구조

to는 기기 토큰, 기기 그룹 토큰, 주제가 들어갈수 있다. 

멀티 캐스트로 발송하려면 to를 사용하지 않고 registration_ids를 사용한다. 

{
  "to": "",
  "notification": {
    "title": "Breaking News",
    "body": "New news story available."
  },
  "data": {
    "story_id": "story_12345"
  }
}

에뮬레이터로 확인해 보면 메시지가 온 것을 확인할 수 있다. 

마치며

여러기기에 메시지를 전송하는 멀티캐스트는 기존 HTTP API만 가능하다. 
보안이나 확장성이 강화된 HTTP V1 API가 있지만
아직까지는 기기 그룹이나 주제 구독 보다는 멀티캐스트를 많이 사용하므로 기존 HTTP API가 주로 사용된다.  


다음 주제는 안드로이드 메시지 처리에 대해서 알아본다. 


Posted by 사용자 피랑이

댓글을 달아 주세요

  1. 김동용 2019.08.28 16:59  댓글주소  수정/삭제  댓글쓰기

    안녕하세요 작성하신 글 잘 읽어보았습니다.
    작성자님의 글을보고 따라하고있었는데요 서버키 json 파일 다운받은 후부터 설명하신게 이해하기 힘듭니다..(뭔가 중간에 생략되어있는것 같구..ㅠㅠ 그리고 혹시 모든 작업을 안드로이드 스튜디오에서 작업하신건가요?? 만약 그렇다면 maven과 pom.xml은 어떻게 사용하신건지...)
    혹시 실례가 안된다면 조금 더 자세하게 설명해 주실수 있으신가요?

  2. 개혁 2019.09.03 10:47  댓글주소  수정/삭제  댓글쓰기

    글 잘봤습니다. 하지만 내용이 길어지면 해당 내용을 볼수가없습니다.

    어떤 방법이 있을까요?

머신러닝 입문하기

Article 2019. 1. 31. 18:18

인공지능? 머신러닝? 딥러닝

인공지능, 머신러닝, 딥러닝에 대해 자세히는 모르지만 대부분 한번쯤을 들어보았을 것이다. 분명 3가지는 차이가 있으며 어떤 차이가 있는지부터 알아보자.


머신러닝은 말 그데로 “기계가 학습?” 그럼 인공지능과 딥러닝은? 마찬가지로 기계학습이라 해도 틀린것은 아니다.

(그림 출처: https://blogs.nvidia.co.kr/2016/08/03/difference_ai_learning_machinelearning/)


인공지능은 매우 포괄적인 개념으로 가장 많이 사용되는 대중적인 단어이다. 특정 기술 분야 뿐아니라 지능적인 요소를 가진 모든 부분에 대해 부르는 이름이다. 예를들어 게임상의 Bot이나 음성인식을 이용한 검색, 통계를 기반으로한 예측시스템들도 인공지능이라 부른다.


반면 머신러닝은 인공지능 안에서의 특정분야를 지칭하는 단어이다. 그리고 그안에 파생된 기술도 딥러닝 뿐만 아니라 다른 많은 기술도 있다. 사실 기계학습, 인공지능에 대한 연구는 예전부터 존재했지만 발전이 없었고 단지 소수에 연구원들에 의한 주제였기에 대중화 될 수 없었다고 한다. 하지만 풍부한 데이터의 확보, 컴퓨팅 성능향상, 오픈소스 라이브러리로 인해 많은 개발자들이 인공지능 연구에 참여하게 되면서부터 크게 부각이 되기 시작했다.


머신러닝

머신러닝은 데이터로부터 학습하도록 컴퓨터를 프로그래밍하는 과학이다. 스팸필터로 예를 들면 스팸필터는 스팸메일과 일반메일의 샘플을 이용해 스팸메일 구분법을 배울수 있는 머신러닝 프로그램이다.


왜 머신러닝을 사용할까? 스팸 필터를 예로 전통적인 프로그래밍 기법과 비교해서 살펴보자.


스팸필터를 만들기 위해서는..


  • 스팸에 어떤 단어즐이 주로 나타나는지? ‘4U’, ‘신용카드’, ‘무료’ 등등
  • 발견한 각 패턴을 감지하는 알고리즘을 작성하여 메일을 스팸으로 분류
  • 프로그램을 테스트하고 충분한 성능이 나올 때까지 1,2단계를 반복


전통적인 접근 방법에는 문제가 단순하지 않아 규칙이 복잡해지기 때문에 유지보수가 매우 힘들다.


반면 머신러닝 기법을 이용한다면 일반 메일에 비해 스팸에 자주 나타나는 패턴을 감지하여 특정 단어나 구절이 스팸 메일을 판단하는 데 좋은 기준인지 자동으로 학습한다. 따라서 유지보수가 쉬우며 정확도가 더 높다.


만약 스팸 메일 발송자가 ‘4U’를 포함한 모든 메일이 차단된다는 것을 안다면 ‘4U’ 대신 ‘For U’를 쓰기 시작할지도 모른다. 전통적인 프로그래밍 방식의 스팸 필터는 ‘For U’메일을 구분하기 위해 수정이 필요하며 단어를 바꾸면 새로운 규칙을 계속 추가해 주어야 한다.


하지만 머신러닝 기반의 스팸 필터는 사용자가 스팸으로 지정한 메일에 유동 ‘For U’가 자주 나타나는 것을 자동으로 인식하고 별도 작업 없이도 자동으로 이 단어를 스팸으로 분류한다.


따라서 머신러닝 기술을 적용해서 대용량 데이터를 분석하면 겉으로는 보이지 않던 패턴을 발견할 수 있다.


머신러닝 시스템의 종류


머신러닝 시스템은 크게 세가지로 구분된다.

지도학습(Supervised Learning), 비지도학습(Unsupervised Learning), 강화학습(Reinforcement Learning)



(그림 출처 : https://www.techleer.com/articles/203-machine-learning-algorithm-backbone-of-emerging-technologies/)


각각의 어떤 특징들을 가지고 있는지 살펴보도록 하자.


지도 학습(Supervised Learning)


“지도학습은 훈련 데이터(Training Data)로부터 하나의 함수를 유추해내기 위한 기계학습의 한 방법이다.” - 위키피디아


정답이 있는 데이터를 기반으로 모델을 만들어 새로운 데이터가 들어왔을때 정답을 맞추는 것이다. 지도학습은 크게 분류(Classification)과 회귀(Regression) 두가지로 분류할 수 있다.


분류 : 이진분류(예 or 아니오), 다중분류(고양이, 사자, 새..) 

회귀 : 어떤 데이터들의 특징을 토대로 값을 예측(결과값은 실수, 키가 170면 몸게는?)


다음은 지도학습에 사용되는 알고리즘이 있다.


- k-최근접 이웃 (k-Nearest Neighbors)

- 선형 회귀 (Linear Regression)

- 로지스틱 회귀 (Logistic Regression)

- 서포트 벡터 머신 (Support Vector Machines (SVM))

- 결정 트리 (Decision Tree) 와 랜덤 포레스트 (Random Forests)

- 신경망 (Neural networks)


지도학습에 사용되는 각각의 알고리즘에 대해서는 다음에 다루도록 하겠다.


비지도 학습(Unsupervised Learning)

비지도 학습에 대해 이야기 하기 전에 먼저 지도 학습과 비지도 학습을 비교한 그림을 보자.


“데이터가 어떻게 구성되었는지를 알아내는 문제의 범주에 속한다.” - 위키피디아


지도학습과는 다르게 정답이 없는 데이터를 가지고 컴퓨터를 학습시키는 방법이다. 즉 데이터의 형태(특징?)으로 학습을 진행한다. (흔히 알고 있는 군집화..) 그리고 데이터를 이용해 컴퓨터는 스스로 어떤 관계를 찾아낸다.


비지도학습도 마찬가지로 다음과 같은 알고리즘이 있다.


군집 (Clustering)

- k-평균 (k-Means)

- 계층 군집 분석 (Hierarchical Cluster Analysis (HCA))

- 기댓값 최대화 (Expectation Maximization)


시각화 (Visualization)와 차원 축소(Dimensionality reduction)

- 주성분 분석 (Principal Component Analysis (PCA))

- 커널 (kernel PCA)

- 지역적 선형 임베딩 (Locally-Linear Embedding (LLE))


연관 규칙 학습 (Association rule learning)

- 어프라이어리 (Apriori)

- 이클렛 (Eclat)


(낯선 용어들이 많이 보여 거부감이 들겠지만, 개념정도는 이해하고 넘어가면 좋을것 같다.)


강화학습(Reinforcement Learning)

(그림 출처 : Hands-On Machine Learning 도서 - 한빛미디어)


강화학습은 상과 벌이라는 보상을 주며 상을 최대화하고 벌을 최소화 하도록 학습하는 방식이다. 주로 제어나 게임 플레이 등 상호작용을 통해서 최적의 동작을 학습해야 할 때 많이 사용된다. 데이터가 먼저 주어지는 지도학습이나 비지도학습과 달리 강화학습은 환경이 있고 에이전트가 그 환경 속에서 어떤 액션을 취하고 그 액션에 따른 어떤 보상을 얻게 되면서 학습이 진행된다. 에이전트가 보상을 최대화 하도록 하면서 학습이 진행되기 때문에 데이터 수집까지 포함하는 동적인 개념의 학습을 하게 된다. 우리의 인생으로 비유를 하자면 마치 시행 착오를 겪으며 경험이 쌓이고 경험을 토데로 옳고 그름을 판단을 수 있게 되는 것과 마찬가지다.


마치며...

얼마전 딥마인드의 알파스타가 프로게이머와의 대결에서 승리 하였다. 강화학습(Population-based reinforcement learning)을 사용하여 하나의 개체로만 학습을 하지 않고 멀티 에이전트로 수많은 개체를 따로 만들어 서로 대전하며 실력을 향상시켰고 최고의 성적을 거둔 에이전트들을 앙상블하여 하나의 모델을 만들었다고 한다. 2016년 알파고에 이어 2019년 알파스타, 불과 3년만에 훨씬 복잡한 문제를 풀었다는게 신기하다. 인간은 학습에 시간적 제약이 있지만 기계는 다르다. 인간이 학습한 10년 동안의 노하우를 기계는 컴퓨팅 파워를 이용해 단시간에 축적할 수 있다는 점을 보면 앞으로의 미래.. 기대도 되지만 두렵기도 하다. 


해당자료 및 영상 링크 : alphastar-mastering-real-time-strategy-game-starcraft-ii

Posted by @위너스

댓글을 달아 주세요


이번 내용에서는 스카우터 클라이언트를 본격적으로 사용하면서 알면 도움이 되는 내용을 주로 다루려고 한다.
수집된 지표를 보기위한 방법은 여러가지가 있지만, 일반적으로 사용하는 방법은 2가지이다.

  • 자바로 된 스카우터 클라이언트 프로그램을 이용해서 확인하는 방법
  • 페이퍼 플러그인을 이용해서 만든 웹서버에 웹브라우저를 통해 접속해서 확인하는 방법

2가지 방법에 대해 소개하고 사용하면서 느낀 활용법을 정리하였다.



스카우터 클라이언트

스카우터 클라이언트의 모습


스카우터 클라이언트는 Windows / MacOS / Linux 용 버전이 제공된다.
맥 버전과 윈도우 버전을 둘다 사용중인데, Java 로 이루어진 덕분에 동일한 사용자경험을 제공한다.

설치 및 기능에 대해서는 스카우터 공식 깃헙에 잘 정리되어 있다. 기본적인 기능에 대해서는 아래 링크를 참조하자.




스카우터 페이퍼 플러그인

웹브라우저로 페이퍼 플러그인에 접속한 모습

(출처 : https://github.com/scouter-contrib/scouter-paper)


스카우터 서버(수집기)에는 데이터를 제공해주는 WEB API 가 있다. 이 WEB API 를 활용해서 많은 플러그인이 만들어지고 있는데, 그 중에 완성도도 높고 오픈소스로 공개된 것이 이 페이퍼 플러그인이다. 단순히 보자면 스카우터 클라이언트의 웹버전이라고 볼 수도 있다. 

리액트(?)로 개발된 페이퍼 플러그인은,  스카우터 서버 WEB API 에서 가져온 정보를 화면에 보여 준다. 

웹브라우저를 통해 사용할수 있다보니 설치하는 번거러움이 줄어 좋다. (누군가에게 급히 자신의 모니터링 시스템에 대해 자랑해야 할 타이밍에도 좋다..)

설치 및 스카우터와의 연동 방법



기능 활용


클라이언트에서 스카우터 설정을 변경하기

스카우터 설정은 스카우터서버, 에이전트호스트, 에이전트자바 이렇게 3곳에서 이루어진다. 
각각의 설치된 경로에 있는 conf 폴더 하위에 scouter.conf 파일을 수정해도 되지만, 스카우트 클라이언트 UI 에서 바로 수정이 가능하다.

(스카우터 서버 의 설정변경 화면)


우측 목록에서 클릭을 하면 툴팁이 나오니 참고하면 좋다.

원하는 값을 우측 목록에서 더블클릭하면 좌측 EDIT 창에 항목정보가 입력된다. 그 후 원하는 값으로 변경을 하고 우측 상단에 디스켓 아이콘을 누르면 저장된다.


저장 아이콘을 누르면, 대부분의 설정은 실시간으로 반영이 된다.

실시간 반영이 안되는 대표적 설정으로 스카우터 에이전트자바 설정 쪽에 hook_ 로 시작하는 설정들이 있다. 이때는 다시 시작을 해야 반영된다.




클라이언트 XLog 서치

XLog는 WAS에 들어온 Http 요청의 처리시간 및 상태를 시각적으로 표시해주는 유용한 그래프이다. 

그래프의 좌측이 과거, 우측이 현재를 뜻한다.



실시간으로 갱신이 되는데, 과거 데이터는 좌측으로 해서 없어지게 된다. 급하게 가까운 과거 데이터를 보고 싶을 때는 키보드의 방향키를 이용하면 이동을 할 수 있다. 위 스크린샷도 과거 데이터를 찾기 위해 방향키를 여러번 누른 상태이다.


현재 그래프로 되돌리고 싶다면 우측 가운데에 있는 검은 큰 점을 클릭하면 된다.


데이터 양이 많을 때는 스카우터 서버의 CPU 자원을 꽤나 먹는것으로 보인다. 스카우터 서버의 성능이 충분치 않은 상황이라면 약간의 주의가 필요할 듯 하다.




클라이언트의 지표 그래프 과거 기록 조회하기

스카우터 클라이언트에는 각 지표별로 과거 데이터를 볼수 있는 3가지 방식이 있다. 
  • Today All : 오늘 날짜의 하루치 모든 데이터
  • Past All : 과거 특정 시점의 모든 데이터
  • Daily All : 특정 날짜의 하루치 데이터

( Today All 방식으로 조회한 하루치 데이터)


사진에는 그래프 각 plot 에 대한 범례가 나오지 않았다. 


아마도 특정 높이 이상에서만 범례가 나오는 것으로 보인다.

정확한 높이는 찾지 못했지만.. 범례가 필요할 때는 드래그 해서 높이를 늘려주면서 확인하면 된다.




스카우터 로그 저장 비율 설정

따로 설정하지 않았다면, 스카우터의 지표 데이터는 스카우터 서버(수집기) 내부에 저장이 된다. 
만약 장비의 디스크가 가득차게 된다면 스카우터 서버 뿐만 아니라 해당 장비에 있는 다른 서비스들에도 영향을 줄 수 있기 때문에 위험하다.

그래서 스카우터에서는 OS의 디스크 사용량이 특정 비율을 넘게 되면 스카우터의 오래된 데이터부터 삭제하도록 설정 할 수 있다.


스카우터 서버 설정 중 mgr_purge_disk_usage_pct 라는 설정에 원하는 비율을 입력해주면 된다.




Customize Alert 설정 

스카우터 클라이언트에서는 각종 상황에 대한 Alert 설정을 할 수가 있다. 

스카우터 깃헙에 정리된 내용을 참조해서 만들어 보았다. 

GC Time 을 기준으로 얼럿 설정해보자.


클라이언트에서 Alert 설정을 편집하기 위해서는 위 메뉴를 누르면 된다.


우측에 나온 편집창에 원하는 스크립트를 넣어주면 된다. 



위 사진에서 사용한 스크립트 내용이다.


int gcTime = $counter.intValue();

if(gcTime > 2000) {

   $counter.fatal("gc time fatal", "gc time:" + respTime + "ms");

}


GC 시간이 2000ms 가 넘으면 얼럿이 발생하는 조건이다.
아래 Alert Configuration 에 있는 항목들로 얼럿의 빈도를 조절할 수 있다.


위와 같이 알럿 설정을 하면 스카우터 클라이언트 얼럿 정보 화면에 얼럿이 뜬다. 

이메일, 메신저 등 외부로 얼럿을 보내고 싶다면 별도의 플러그인을 설치하여야 하는데, 이에 대해서는 3부에서 다루어 보려고 한다.





스카우터 서버 아이디 / 비밀번호 설정

스카우터 클라이언트로 스카우터 서버에 접속하려고 하면 주소와 아이디/비번이 필요하다.
처음 설치 때 세팅되는 기본 아이디/비번은 admin/admin 이다.

위에도 설명했지만, 클라이언트로 할 수 있는것들이 꽤나 많다. 악의적으로 과부하를 일으킬 수 도 있고, 지표에 대한 데이터를 노출하게 될 수도 있다.
스카우터 서버(수집기)가 외부와 네트워크로 단단히 격리 되어있는 상황이 아니라면 아이디/비번은 변경을 꼭 해야 한다.

변경은 아래 메뉴에서 가능하다.






마치며.. 
본인도 스카우터 클라이언트와 페이퍼 플러그인을 사용중이다. 이 툴들을 통해 아름답게 표현되는 지표는 보기만 해도 흐뭇해진다.
하지만.. 장애상황이나 시스템이 위험한 상황이 되었을 때를 알기 위해 24시간 이것들을 볼수는 없고, 다양한 외부 얼럿을 설정하였다.
3부에서는 스카우터에서 할 수 있는 외부 얼럿 기능에 대해 다뤄보겠다.



Posted by panpid

댓글을 달아 주세요