엔지니어링

학습, 평가, 모니터링, 추론: Elastic의 엔드 투 엔드 머신 러닝

머신 러닝 파이프라인은 지난 몇 년 동안 엄청나게 진화해 왔습니다. 구축, 학습, 배포를 단순화하기 위한 다양한 도구와 프레임워크를 통해 머신 러닝 모델 개발의 소요 시간이 대폭 단축되었습니다. 그러나, 이러한 모든 단순화에도 불구하고, 여전히 많은 도구를 숙지해야 하기 때문에 초기에 많은 시간과 노력을 투자해야 합니다. 그러나 Elastic은 그렇지 않습니다.

Elastic Stack에서 머신 러닝을 사용하려면 정말로 데이터를 Elasticsearch에 저장하기만 하면 됩니다. 일단 데이터를 저장하면, Kibana에서 간단히 버튼 몇 개만 클릭하여 데이터로부터 귀중한 인사이트를 얻을 수 있습니다. Elastic Stack에 머신 러닝이 탑재되어, 완벽하게 작동하는 엔드 투 엔드 머신 러닝 파이프라인을 쉽고 직관적으로 구축할 수 있습니다. 이 블로그에서 바로 그 작업을 해보려고 합니다.

Elastic을 사용하는 이유

검색 기업이 된다는 것은 Elastic이 대량의 데이터를 효율적으로 처리하도록 구축된다는 것을 의미합니다. Elasticsearch Query DSL을 사용해 간단하고 직관적으로 데이터를 검색하고 집계하여 분석할 수 있습니다. Kibana에서는 다양한 방법으로 대용량 데이터 세트를 시각화할 수 있습니다. Elastic 머신 러닝 인터페이스를 통해 간단한 기능과 모델 선택, 모델 학습 및 하이퍼파라미터 조정이 가능합니다. 그리고 모델을 학습시키고 조정한 후에, Kibana를 사용하여 모델을 평가하고 시각적으로 모니터링할 수도 있습니다. 이를 통해 Elastic Stack은 프로덕션 수준의 머신 러닝을 위한 완벽한 원스톱 숍이 됩니다.

데이터 집합 예: EMBER 2018

이식 가능한 실행(PE) 파일에서 파생된 정적 기능을 이용한 Malware 탐지가 가능하도록 Endgame이 출시한 EMBER 데이터 세트를 사용해 Elastic Stack에서 엔드 투 엔드 머신 러닝을 시연해 보겠습니다. 이번 시연을 위해 샘플 100만개의 오픈 소스 모음인 EMBER(Endgame Malware BEnchmark for Research) 2018 데이터 세트를 사용하겠습니다. 각 샘플에는 샘플 파일의 sha256 hash, 파일이 처음 나타난 달, 라벨, 파일에서 파생된 기능이 포함됩니다. 

이번 실험을 위해 EMBER 2018 데이터 세트에서 샘플 30만 개(악성 15만 개, 양성 15만 개)를 선정합니다. 샘플에 대해 지도된 학습을 수행하려면 먼저 몇 가지 기능을 선택해야 합니다. 데이터 세트의 기능은 바이너리 파일의 내용에서 파생된 정적 기능입니다. 우리는 EMBER 데이터 세트 기능의 다른 하위 집합을 사용하는 데 대한 모델 성능을 연구하기 위해 일반, 파일 헤더 및 섹션 정보, 문자열 및 바이트 히스토그램으로 실험하기로 결정했습니다. 

Elastic Stack의 엔드 투 엔드 머신 러닝: 단계별 안내

본 시연에서는 Python Elasticsearch 클라이언트를 사용해 Elasticsearch에 데이터를 넣고, Elastic 머신 러닝의 데이터 프레임 분석 기능을 사용해 학습 작업을 생성하며, Kibana를 사용해 학습 후 모델을 시각적으로 모니터링하겠습니다. 

일반, 파일 헤더 및 섹션 정보, 문자열을 사용하는 작업 한 개와 바이트 히스토그램 기능만 사용하는 작업 한 개, 이렇게 두 개의 지도된 작업을 만들 것입니다. 이는 나중에 Stack에서 동시 다중 모델 학습과 여러 후보 모델의 시각화를 시연하기 위한 것입니다.

Elasticsearch 설정

Elastic Stack에서 머신 러닝을 사용하려면 우선 머신 러닝 노드로 Elasticsearch를 스핀업해야 합니다. 이를 위해 누구나 사용해 보도록 제공되는 Elastic Cloud 14일 무료 체험판을 시작할 수 있습니다. 배포 예제의 설정은 다음과 같습니다.

  • Cloud Platform(클라우드 플랫폼): Amazon Web Services
  • Region(지역): US West (N. California)
  • Optimization(최적화): I/O Optimized
  • Customize Deployment(배포 사용자 정의): Enable Machine Learning

또한 API 키를 만들고 Python Elasticsearch 클라이언트를 사용하여 Elasticsearch와 상호 작용할 수 있는 적절한 권한을 이 키에 할당해야 합니다. 단계별 안내를 위해 ember_ml 인덱스에 데이터를 넣을 예정이므로 다음과 같은 키를 생성하겠습니다.

POST /_security/api_key 
{ 
  "name": "my_awesome_key", 
  "role_descriptors": { 
    "role_1": { 
      "cluster": ["all"], 
      "index": [ 
        { 
          "names": ["ember_*], 
          "privileges": ["all"] 
        } 
      ] 
    } 
  } 
}

데이터 수집

Elasticsearch 인스턴스가 설정되면 Elasticsearch 인덱스로 데이터를 수집하면서 시작하겠습니다. 먼저 ember_ml이라는 인덱스를 만든 다음 Python Elasticsearch 클라이언트를 사용해 데이터 세트를 구성하는 문서를 수집할 것입니다. Streaming Bulk Helper를 사용해 두 모델에 필요한 모든 기능을 단일 인덱스로 수집하여 문서를 Elasticsearch로 대량 수집하게 됩니다. ember_ml 인덱스와 대량 수집 문서를 생성하기 위한 Python 코드는 다음과 같습니다.

import elasticsearch 
import certifi 
from elasticsearch import Elasticsearch, helpers 
# Elasticsearch에 넣을 문서의 긴 목록(예를 들기 위해 목록 한 개 표시) 
documents = [ 
  { 
    "_index": "ember_ml", 
    "_id": "771434adbbfa2ff5740eb91d9deb51828e0f4b060826b590cd9fd8dd46ee0d40", 
    "_source": { 
      "sha256": "771434adbbfa2ff5740eb91d9deb51828e0f4b060826b590cd9fd8dd46ee0d4b", 
      "appeared": "2018-01-06 00:00:00", 
      "label": 1, 
      "byte_0": 0.1826012283563614, 
      "byte_1": 0.006036404054611921, 
      "byte_2": 0.003830794943496585, 
      "byte_3": 0.004225482698529959, 
      "byte_4": 0.004388001281768084, 
      "byte_5": 0.0036218424793332815, 
      "byte_6": 0.0035289747174829245, 
      "byte_7": 0.004666604567319155, 
      "byte_8": 0.004225482698529959, 
      "byte_9": 0.0029253342654556036, 
      "byte_10": 0.0034361069556325674, 
      "byte_11": 0.003993313293904066, 
      "byte_12": 0.004039747174829245, 
      "byte_13": 0.0029253342654556036, 
      "byte_14": 0.0030182020273059607, 
      "byte_15": 0.0036450594197958708, 
      "byte_16": 0.004573736805468798, 
      "byte_17": 0.002693164860829711, 
      "byte_18": 0.002507429337128997, 
      "byte_19": 0.0026699479203671217, 
      "byte_20": 0.003505757777020335, 
      "byte_21": 0.0022056091111153364, 
      "byte_22": 0.0032503714319318533, 
      "byte_23": 0.0025770801585167646, 
      "byte_24": 0.005363112781196833, 
      "byte_25": 0.002600297098979354, 
      "byte_26": 0.0025538632180541754, 
      "byte_27": 0.0031807206105440855, 
      "byte_28": 0.0034593238960951567, 
      "byte_29": 0.0022288260515779257, 
      "byte_30": 0.002507429337128997, 
      "byte_31": 0.0025770801585167646, 
      "byte_32": 0.004921990912407637, 
      "byte_33": 0.0028092495631426573, 
      "byte_34": 0.0017877042992040515, 
      "byte_35": 0.0033664561342447996, 
      "byte_36": 0.002437778515741229, 
      "byte_37": 0.0021359582897275686, 
      "byte_38": 0.0016716195968911052, 
      "byte_39": 0.0020430905278772116, 
      "byte_40": 0.003227154491469264, 
      "byte_41": 0.0025770801585167646, 
      "byte_42": 0.0017644873587414622, 
      "byte_43": 0.0032039375510066748, 
      "byte_44": 0.003296805312857032, 
      "byte_45": 0.003134286729618907, 
      "byte_46": 0.0028324665036052465, 
      "byte_47": 0.003505757777020335, 
      "byte_48": 0.0038772288244217634, 
      "byte_49": 0.0035521916579455137, 
      "byte_50": 0.0031110697891563177, 
      "byte_51": 0.00417904881760478, 
      "byte_52": 0.004225482698529959, 
      "byte_53": 0.0032503714319318533, 
      "byte_54": 0.0035289747174829245, 
      "byte_55": 0.003320022253319621, 
      "byte_56": 0.0030878528486937284, 
      "byte_57": 0.003575408598408103, 
      "byte_58": 0.002182392170652747, 
      "byte_59": 0.0029021173249930143, 
      "byte_60": 0.002344910753890872, 
      "byte_61": 0.0020430905278772116, 
      "byte_62": 0.0015555348945781589, 
      "byte_63": 0.0020198735874146223, 
      "byte_64": 0.004016530234366655, 
      "byte_65": 0.004457652103155851, 
      "byte_66": 0.0036450594197958708, 
      "byte_67": 0.0036218424793332815, 
      "byte_68": 0.0038075780030339956, 
      "byte_69": 0.0033432391937822104, 
      "byte_70": 0.004852340091019869, 
      "byte_71": 0.004039747174829245, 
      "byte_72": 0.00480590621009469, 
      "byte_73": 0.002971768146380782, 
      "byte_74": 0.002693164860829711, 
      "byte_75": 0.0039468794129788876, 
      "byte_76": 0.0036450594197958708, 
      "byte_77": 0.0034361069556325674, 
      "byte_78": 0.0028324665036052465, 
      "byte_79": 0.0028324665036052465, 
      "byte_80": 0.005664933007210493, 
      "byte_81": 0.0029949850868433714, 
      "byte_82": 0.0031110697891563177, 
      "byte_83": 0.004527302924543619, 
      "byte_84": 0.003923662472516298, 
      "byte_85": 0.0029949850868433714, 
      "byte_86": 0.004016530234366655, 
      "byte_87": 0.004573736805468798, 
      "byte_88": 0.004109397996217012, 
      "byte_89": 0.003296805312857032, 
      "byte_90": 0.0033664561342447996, 
      "byte_91": 0.0034593238960951567, 
      "byte_92": 0.0031110697891563177, 
      "byte_93": 0.0022984768729656935, 
      "byte_94": 0.0022288260515779257, 
      "byte_95": 0.002275259932503104, 
      "byte_96": 0.002855683444067836, 
      "byte_97": 0.0035986255388706923, 
      "byte_98": 0.0026699479203671217, 
      "byte_99": 0.0037843610625714064, 
      "byte_100": 0.004364784341305494, 
      "byte_101": 0.004016530234366655, 
      "byte_102": 0.004713038448244333, 
      "byte_103": 0.003505757777020335, 
      "byte_104": 0.005479197483509779, 
      "byte_105": 0.0032503714319318533, 
      "byte_106": 0.00366827636025846, 
      "byte_107": 0.004016530234366655, 
      "byte_108": 0.005061292555183172, 
      "byte_109": 0.005014858674257994, 
      "byte_110": 0.0039468794129788876, 
      "byte_111": 0.004109397996217012, 
      "byte_112": 0.004596953745931387, 
      "byte_113": 0.0021127413492649794, 
      "byte_114": 0.0046433876268565655, 
      "byte_115": 0.004086181055754423, 
      "byte_116": 0.005664933007210493, 
      "byte_117": 0.005293461959809065, 
      "byte_118": 0.0039468794129788876, 
      "byte_119": 0.0038075780030339956, 
      "byte_120": 0.0035289747174829245, 
      "byte_121": 0.004480869043618441, 
      "byte_122": 0.00183413818012923, 
      "byte_123": 0.0032503714319318533, 
      "byte_124": 0.0027163818012923002, 
      "byte_125": 0.002066307468339801, 
      "byte_126": 0.003505757777020335, 
      "byte_127": 0.002252042992040515, 
      "byte_128": 0.0033432391937822104, 
      "byte_129": 0.0032039375510066748, 
      "byte_130": 0.001741270418278873, 
      "byte_131": 0.003923662472516298, 
      "byte_132": 0.003830794943496585, 
      "byte_133": 0.0033664561342447996, 
      "byte_134": 0.0034361069556325674, 
      "byte_135": 0.0014162332518026233, 
      "byte_136": 0.002600297098979354, 
      "byte_137": 0.00304141896776855, 
      "byte_138": 0.0022984768729656935, 
      "byte_139": 0.0037147102411836386, 
      "byte_140": 0.0051773772574961185, 
      "byte_141": 0.003296805312857032, 
      "byte_142": 0.0031575036700814962, 
      "byte_143": 0.0015555348945781589, 
      "byte_144": 0.003064635908231139, 
      "byte_145": 0.002693164860829711, 
      "byte_146": 0.0012304977281019092, 
      "byte_147": 0.0015555348945781589, 
      "byte_148": 0.003830794943496585, 
      "byte_149": 0.0028092495631426573, 
      "byte_150": 0.00208952440880239, 
      "byte_151": 0.0014626671327278018, 
      "byte_152": 0.0026699479203671217, 
      "byte_153": 0.004388001281768084, 
      "byte_154": 0.0019502228824421763, 
      "byte_155": 0.0017644873587414622, 
      "byte_156": 0.004086181055754423, 
      "byte_157": 0.0017180534778162837, 
      "byte_158": 0.003412890015169978, 
      "byte_159": 0.002252042992040515, 
      "byte_160": 0.002507429337128997, 
      "byte_161": 0.002437778515741229, 
      "byte_162": 0.002623514039441943, 
      "byte_163": 0.0022288260515779257, 
      "byte_164": 0.0020430905278772116, 
      "byte_165": 0.0022984768729656935, 
      "byte_166": 0.0017180534778162837, 
      "byte_167": 0.0010911960853263736, 
      "byte_168": 0.002159175230190158, 
      "byte_169": 0.0015091010136529803, 
      "byte_170": 0.003227154491469264, 
      "byte_171": 0.0025770801585167646, 
      "byte_172": 0.0027628156822174788, 
      "byte_173": 0.0029253342654556036, 
      "byte_174": 0.0013697993708774447, 
      "byte_175": 0.001648402656428516, 
      "byte_176": 0.003134286729618907, 
      "byte_177": 0.0016019687755033374, 
      "byte_178": 0.002437778515741229, 
      "byte_179": 0.001927005941979587, 
      "byte_180": 0.0027163818012923002, 
      "byte_181": 0.004016530234366655, 
      "byte_182": 0.003227154491469264, 
      "byte_183": 0.00241456157527864, 
      "byte_184": 0.0025538632180541754, 
      "byte_185": 0.00208952440880239, 
      "byte_186": 0.001648402656428516, 
      "byte_187": 0.002275259932503104, 
      "byte_188": 0.0025538632180541754, 
      "byte_189": 0.0028092495631426573, 
      "byte_190": 0.0021359582897275686, 
      "byte_191": 0.0027395987417548895, 
      "byte_192": 0.0030878528486937284, 
      "byte_193": 0.0027395987417548895, 
      "byte_194": 0.00208952440880239, 
      "byte_195": 0.002878900384530425, 
      "byte_196": 0.0021359582897275686, 
      "byte_197": 0.00208952440880239, 
      "byte_198": 0.0027395987417548895, 
      "byte_199": 0.0019734397064894438, 
      "byte_200": 0.003064635908231139, 
      "byte_201": 0.002066307468339801, 
      "byte_202": 0.0012304977281019092, 
      "byte_203": 0.00183413818012923, 
      "byte_204": 0.003389673074707389, 
      "byte_205": 0.00304141896776855, 
      "byte_206": 0.0029021173249930143, 
      "byte_207": 0.0024609954562038183, 
      "byte_208": 0.0029021173249930143, 
      "byte_209": 0.002507429337128997, 
      "byte_210": 0.0022288260515779257, 
      "byte_211": 0.0019734397064894438, 
      "byte_212": 0.0023913446348160505, 
      "byte_213": 0.0017180534778162837, 
      "byte_214": 0.0032735883723944426, 
      "byte_215": 0.0023216938134282827, 
      "byte_216": 0.003412890015169978, 
      "byte_217": 0.0025538632180541754, 
      "byte_218": 0.002530646277591586, 
      "byte_219": 0.004550519865006208, 
      "byte_220": 0.003320022253319621, 
      "byte_221": 0.002437778515741229, 
      "byte_222": 0.003389673074707389, 
      "byte_223": 0.002855683444067836, 
      "byte_224": 0.0031575036700814962, 
      "byte_225": 0.0018109212396666408, 
      "byte_226": 0.002182392170652747, 
      "byte_227": 0.003737927181646228, 
      "byte_228": 0.0036218424793332815, 
      "byte_229": 0.0014626671327278018, 
      "byte_230": 0.0024609954562038183, 
      "byte_231": 0.002600297098979354, 
      "byte_232": 0.0024609954562038183, 
      "byte_233": 0.0015323179541155696, 
      "byte_234": 0.001137629966251552, 
      "byte_235": 0.004341567400842905, 
      "byte_236": 0.004782689269632101, 
      "byte_237": 0.0024609954562038183, 
      "byte_238": 0.0016716195968911052, 
      "byte_239": 0.0028092495631426573, 
      "byte_240": 0.0036218424793332815, 
      "byte_241": 0.00183413818012923, 
      "byte_242": 0.0035289747174829245, 
      "byte_243": 0.002623514039441943, 
      "byte_244": 0.0022984768729656935, 
      "byte_245": 0.001741270418278873, 
      "byte_246": 0.003296805312857032, 
      "byte_247": 0.003412890015169978, 
      "byte_248": 0.003134286729618907, 
      "byte_249": 0.0023913446348160505, 
      "byte_250": 0.0012304977281019092, 
      "byte_251": 0.0067561292089521885, 
      "byte_252": 0.005943536292761564, 
      "byte_253": 0.0031575036700814962, 
      "byte_254": 0.004480869043618441, 
      "byte_255": 0.038958024233579636, 
      "strings_0": 488, 
      "strings_1": 7.477458953857422, 
      "strings_2": 3649, 
      "strings_3": 0.011784050613641739, 
      "strings_4": 0.0043847630731761456, 
      "strings_5": 0.003562619909644127, 
      "strings_6": 0.005206905771046877, 
      "strings_7": 0.004110715351998806, 
      "strings_8": 0.003014524467289448, 
      "strings_9": 0.003562619909644127, 
      "strings_10": 0.005755001213401556, 
      "strings_11": 0.006029048934578896, 
      "strings_12": 0.003014524467289448, 
      "strings_13": 0.0019183338154107332, 
      "strings_14": 0.010961906984448433, 
      "strings_15": 0.006577144376933575, 
      "strings_16": 0.006851192098110914, 
      "strings_17": 0.008769526146352291, 
      "strings_18": 0.013428336940705776, 
      "strings_19": 0.011784050613641739, 
      "strings_20": 0.012058097869157791, 
      "strings_21": 0.014250479638576508, 
      "strings_22": 0.013428336940705776, 
      "strings_23": 0.01315428875386715, 
      "strings_24": 0.01068785972893238, 
      "strings_25": 0.01315428875386715, 
      "strings_26": 0.012880241498351097, 
      "strings_27": 0.010139764286577702, 
      "strings_28": 0.010413811542093754, 
      "strings_29": 0.0027404767461121082, 
      "strings_30": 0.006029048934578896, 
      "strings_31": 0.004658810794353485, 
      "strings_32": 0.0021923815365880728, 
      "strings_33": 0.0027404767461121082, 
      "strings_34": 0.004110715351998806, 
      "strings_35": 0.005755001213401556, 
      "strings_36": 0.01589476503431797, 
      "strings_37": 0.011784050613641739, 
      "strings_38": 0.01397643145173788, 
      "strings_39": 0.010413811542093754, 
      "strings_40": 0.016168814152479172, 
      "strings_41": 0.015346670523285866, 
      "strings_42": 0.012332146055996418, 
      "strings_43": 0.013428336940705776, 
      "strings_44": 0.01452452689409256, 
      "strings_45": 0.00986571703106165, 
      "strings_46": 0.016442861407995224, 
      "strings_47": 0.014798575080931187, 
      "strings_48": 0.012058097869157791, 
      "strings_49": 0.01068785972893238, 
      "strings_50": 0.010413811542093754, 
      "strings_51": 0.015620717778801918, 
      "strings_52": 0.010139764286577702, 
      "strings_53": 0.013428336940705776, 
      "strings_54": 0.015072622336447239, 
      "strings_55": 0.014250479638576508, 
      "strings_56": 0.011510002426803112, 
      "strings_57": 0.012880241498351097, 
      "strings_58": 0.01397643145173788, 
      "strings_59": 0.012332146055996418, 
      "strings_60": 0.01068785972893238, 
      "strings_61": 0.00931762158870697, 
      "strings_62": 0.00986571703106165, 
      "strings_63": 0.005206905771046877, 
      "strings_64": 0.003014524467289448, 
      "strings_65": 0.003014524467289448, 
      "strings_66": 0.003562619909644127, 
      "strings_67": 0.0043847630731761456, 
      "strings_68": 0.01397643145173788, 
      "strings_69": 0.010413811542093754, 
      "strings_70": 0.017539052292704582, 
      "strings_71": 0.017539052292704582, 
      "strings_72": 0.02000548131763935, 
      "strings_73": 0.016442861407995224, 
      "strings_74": 0.014250479638576508, 
      "strings_75": 0.01452452689409256, 
      "strings_76": 0.01260619331151247, 
      "strings_77": 0.011510002426803112, 
      "strings_78": 0.013428336940705776, 
      "strings_79": 0.014798575080931187, 
      "strings_80": 0.016442861407995224, 
      "strings_81": 0.01452452689409256, 
      "strings_82": 0.017813099548220634, 
      "strings_83": 0.015072622336447239, 
      "strings_84": 0.00931762158870697, 
      "strings_85": 0.01452452689409256, 
      "strings_86": 0.014250479638576508, 
      "strings_87": 0.015620717778801918, 
      "strings_88": 0.014250479638576508, 
      "strings_89": 0.012332146055996418, 
      "strings_90": 0.013702384196221828, 
      "strings_91": 0.01397643145173788, 
      "strings_92": 0.00986571703106165, 
      "strings_93": 0.006303096655756235, 
      "strings_94": 0.004110715351998806, 
      "strings_95": 0.0027404767461121082, 
      "strings_96": 0.0027404767461121082, 
      "strings_97": 0.0024664292577654123, 
      "strings_98": 0.007399287540465593, 
      "strings_99": 6.4175848960876465, 
      "strings_100": 0, 
      "strings_101": 0, 
      "strings_102": 0, 
      "strings_103": 3, 
      "general_info_0": 43072, 
      "general_info_1": 110592, 
      "general_info_2": 0, 
      "general_info_3": 0, 
      "general_info_4": 5, 
      "general_info_5": 0, 
      "general_info_6": 1, 
      "general_info_7": 0, 
      "general_info_8": 0, 
      "general_info_9": 0, 
      "file_header_0": 1142459136, 
      "file_header_1": 0, 
      "file_header_2": 0, 
      "file_header_3": 0, 
      "file_header_4": 0, 
      "file_header_5": 0, 
      "file_header_6": 1, 
      "file_header_7": 0, 
      "file_header_8": 0, 
      "file_header_9": 0, 
      "file_header_10": 0, 
      "file_header_11": 0, 
      "file_header_12": 0, 
      "file_header_13": -1, 
      "file_header_14": 0, 
      "file_header_15": -1, 
      "file_header_16": -1, 
      "file_header_17": 0, 
      "file_header_18": 0, 
      "file_header_19": 0, 
      "file_header_20": 0, 
      "file_header_21": 0, 
      "file_header_22": 0, 
      "file_header_23": 0, 
      "file_header_24": 0, 
      "file_header_25": 0, 
      "file_header_26": 0, 
      "file_header_27": 0, 
      "file_header_28": 1, 
      "file_header_29": 0, 
      "file_header_30": 0, 
      "file_header_31": 0, 
      "file_header_32": 0, 
      "file_header_33": 0, 
      "file_header_34": 0, 
      "file_header_35": 0, 
      "file_header_36": 0, 
      "file_header_37": 0, 
      "file_header_38": 0, 
      "file_header_39": 0, 
      "file_header_40": 0, 
      "file_header_41": 0, 
      "file_header_42": -1, 
      "file_header_43": 0, 
      "file_header_44": 0, 
      "file_header_45": 0, 
      "file_header_46": 0, 
      "file_header_47": 0, 
      "file_header_48": 0, 
      "file_header_49": 0, 
      "file_header_50": 0, 
      "file_header_51": 0, 
      "file_header_52": 0, 
      "file_header_53": 2, 
      "file_header_54": 48, 
      "file_header_55": 4, 
      "file_header_56": 0, 
      "file_header_57": 4, 
      "file_header_58": 0, 
      "file_header_59": 32768, 
      "file_header_60": 4096, 
      "file_header_61": 4096, 
      "sections_0": 3, 
      "sections_1": 1, 
      "sections_2": 0, 
      "sections_3": 1, 
      "sections_4": 3, 
      "sections_5": 0, 
      "sections_6": 0, 
      "sections_7": 0, 
      "sections_8": 0, 
      "sections_9": 0, 
      "sections_10": 0, 
      "sections_11": 0, 
      "sections_12": 0, 
      "sections_13": 0, 
      "sections_14": 0, 
      "sections_15": 0, 
      "sections_16": 0, 
      "sections_17": 0, 
      "sections_18": 0, 
      "sections_19": 0, 
      "sections_20": 0, 
      "sections_21": 0, 
      "sections_22": 0, 
      "sections_23": 0, 
      "sections_24": 0, 
      "sections_25": 0, 
      "sections_26": 0, 
      "sections_27": 0, 
      "sections_28": 0, 
      "sections_29": 0, 
      "sections_30": 0, 
      "sections_31": 0, 
      "sections_32": 0, 
      "sections_33": 0, 
      "sections_34": 0, 
      "sections_35": 0, 
      "sections_36": 0, 
      "sections_37": 0, 
      "sections_38": 0, 
      "sections_39": 0, 
      "sections_40": 0, 
      "sections_41": 0, 
      "sections_42": 0, 
      "sections_43": 0, 
      "sections_44": 0, 
      "sections_45": 0, 
      "sections_46": 0, 
      "sections_47": 0, 
      "sections_48": 0, 
      "sections_49": 0, 
      "sections_50": 0, 
      "sections_51": 0, 
      "sections_52": -42048, 
      "sections_53": 0, 
      "sections_54": 0, 
      "sections_55": 0, 
      "sections_56": 0, 
      "sections_57": 0, 
      "sections_58": 0, 
      "sections_59": 0, 
      "sections_60": 0, 
      "sections_61": 0, 
      "sections_62": 0, 
      "sections_63": 0, 
      "sections_64": 0, 
      "sections_65": 0, 
      "sections_66": 0, 
      "sections_67": 0, 
      "sections_68": 0, 
      "sections_69": 0, 
      "sections_70": 0, 
      "sections_71": 0, 
      "sections_72": 0, 
      "sections_73": 0, 
      "sections_74": 0, 
      "sections_75": 0, 
      "sections_76": 0, 
      "sections_77": 0, 
      "sections_78": 0, 
      "sections_79": 0, 
      "sections_80": 0, 
      "sections_81": 0, 
      "sections_82": 0, 
      "sections_83": 0, 
      "sections_84": 0, 
      "sections_85": 0, 
      "sections_86": 0, 
      "sections_87": 0, 
      "sections_88": 0, 
      "sections_89": 0, 
      "sections_90": 0, 
      "sections_91": 0, 
      "sections_92": 0, 
      "sections_93": 0, 
      "sections_94": 0, 
      "sections_95": 0, 
      "sections_96": 0, 
      "sections_97": 0, 
      "sections_98": 0, 
      "sections_99": 0, 
      "sections_100": 0, 
      "sections_101": 0, 
      "sections_102": -11.691457748413086, 
      "sections_103": 0, 
      "sections_104": 0, 
      "sections_105": 0, 
      "sections_106": 0, 
      "sections_107": 0, 
      "sections_108": 0, 
      "sections_109": 0, 
      "sections_110": 0, 
      "sections_111": 0, 
      "sections_112": 0, 
      "sections_113": 0, 
      "sections_114": 0, 
      "sections_115": 0, 
      "sections_116": 0, 
      "sections_117": 0, 
      "sections_118": 0, 
      "sections_119": 0, 
      "sections_120": 0, 
      "sections_121": 0, 
      "sections_122": 0, 
      "sections_123": 0, 
      "sections_124": 0, 
      "sections_125": 0, 
      "sections_126": 0, 
      "sections_127": 0, 
      "sections_128": 0, 
      "sections_129": 0, 
      "sections_130": 0, 
      "sections_131": 0, 
      "sections_132": 0, 
      "sections_133": 0, 
      "sections_134": 0, 
      "sections_135": 0, 
      "sections_136": 0, 
      "sections_137": 0, 
      "sections_138": 0, 
      "sections_139": 0, 
      "sections_140": 0, 
      "sections_141": 0, 
      "sections_142": 0, 
      "sections_143": 0, 
      "sections_144": 0, 
      "sections_145": 0, 
      "sections_146": 0, 
      "sections_147": 0, 
      "sections_148": 0, 
      "sections_149": 0, 
      "sections_150": 0, 
      "sections_151": 0, 
      "sections_152": -102464, 
      "sections_153": 0, 
      "sections_154": 0, 
      "sections_155": 0, 
      "sections_156": 0, 
      "sections_157": 2, 
      "sections_158": 0, 
      "sections_159": 0, 
      "sections_160": 0, 
      "sections_161": 0, 
      "sections_162": 0, 
      "sections_163": 0, 
      "sections_164": 2, 
      "sections_165": 0, 
      "sections_166": 0, 
      "sections_167": 2, 
      "sections_168": 0, 
      "sections_169": 0, 
      "sections_170": 0, 
      "sections_171": 0, 
      "sections_172": 0, 
      "sections_173": 0, 
      "sections_174": 0, 
      "sections_175": 0, 
      "sections_176": 0, 
      "sections_177": 0, 
      "sections_178": 0, 
      "sections_179": 0, 
      "sections_180": 0, 
      "sections_181": 2, 
      "sections_182": 0, 
      "sections_183": 0, 
      "sections_184": 0, 
      "sections_185": 0, 
      "sections_186": 0, 
      "sections_187": 0, 
      "sections_188": 0, 
      "sections_189": 0, 
      "sections_190": 0, 
      "sections_191": 0, 
      "sections_192": 0, 
      "sections_193": 0, 
      "sections_194": 0, 
      "sections_195": 0, 
      "sections_196": 0, 
      "sections_197": 0, 
      "sections_198": 0, 
      "sections_199": 0, 
      "sections_200": 0, 
      "sections_201": 0, 
      "sections_202": 0, 
      "sections_203": 0, 
      "sections_204": 0, 
      "sections_205": 2, 
      "sections_206": 0, 
      "sections_207": 0, 
      "sections_208": 0, 
      "sections_209": 0, 
      "sections_210": 0, 
      "sections_211": 0, 
      "sections_212": 0, 
      "sections_213": 0, 
      "sections_214": 0, 
      "sections_215": 0, 
      "sections_216": 0, 
      "sections_217": 0, 
      "sections_218": -1, 
      "sections_219": 0, 
      "sections_220": 0, 
      "sections_221": 0, 
      "sections_222": 0, 
      "sections_223": 0, 
      "sections_224": 0, 
      "sections_225": 0, 
      "sections_226": 0, 
      "sections_227": 0, 
      "sections_228": 3, 
      "sections_229": 0, 
      "sections_230": 0, 
      "sections_231": 0, 
      "sections_232": 0, 
      "sections_233": 0, 
      "sections_234": 0, 
      "sections_235": 0, 
      "sections_236": 0, 
      "sections_237": 0, 
      "sections_238": 0, 
      "sections_239": 0, 
      "sections_240": 0, 
      "sections_241": 0, 
      "sections_242": 3, 
      "sections_243": 0, 
      "sections_244": 0, 
      "sections_245": 0, 
      "sections_246": 0, 
      "sections_247": 0, 
      "sections_248": 0, 
      "sections_249": 0, 
      "sections_250": 0, 
      "sections_251": 0, 
      "sections_252": -1, 
      "sections_253": 0, 
      "sections_254": 0 
    } 
  } 
] 
url = "YOUR_KIBANA_ENDPOINT_URL" 
api_key = "YOUR_API_KEY" 
api_id = "YOUR_API_ID" 
# Elasticsearch 클라이언트 초기화 
es = Elasticsearch( 
        url, 
        api_key=(api_id, api_key), 
        use_ssl=True, 
        ca_certs=certifi.where() 
    ) 
# 인덱스 생성 
es.indices.create(index="ember_ml") 
# 문서를 Elasticsearch로 대량 수집 
try: 
    for success, info in helpers.streaming_bulk(es, documents, chunk_size=2500): 
        if not success: 
            print("A document failed:", info) 
except elasticsearch.ElasticsearchException: 
    print("Failed to insert")

데이터 프레임 분석은 하나 이상의 요소를 가진 배열을 지원하지 않기 때문에 기능 벡터를 병합해야 합니다. 즉, 각 기능은 각 문서에서 지원되는 데이터 유형(숫자, 부울, 텍스트, 키워드 또는 IP)의 별도 필드여야 합니다. 또한 EMBER 데이터 세트에서 "나타난"(처음 보이는) 필드가 나중에 시계열 시각화를 위해 Elasticsearch 호환 날짜 형식과 일치하도록 변경되었다는 점에 유의하세요. 

모든 데이터가 올바른 형식으로 ElasticSearch에 수집되도록 개발 도구 콘솔(관리 -> 개발 도구)에서 다음 쿼리를 실행합니다.

문서 수를 가져오려면

GET ember_ml/_count

인덱스에서 문서를 검색하고 올바른 형식인지 확인하려면

GET ember_ml/_search

Elasticsearch의 데이터가 예상대로 보이는지 확인했으면 이제 분석 작업을 생성할 준비가 되었습니다. 다만, 작업을 만들기 전에 그 작업에 대한 인덱스 패턴을 정의해야 합니다. 인덱스 패턴은 Kibana(그리고 결과적으로 해당 작업)에게 어느 Elasticsearch 인덱스에 작업하고자 하는 데이터가 포함되어 있는지를 알려줍니다. 우리는 인덱스 ember_ml과 일치하도록 인덱스 패턴 ember_*를 만듭니다.

모델 학습

인덱스 패턴이 생성되면 위에서 언급한 것처럼 기능의 두 하위 집합을 사용하여 두 개의 분석 작업을 만듭니다. 이것은 Kibana의 Machine Learning 앱을 통해 할 수 있습니다. 다음과 같이 작업을 구성하겠습니다.

  • 작업 유형: 주어진 바이너리가 악성인지 양성인지 예측하기 위해 "분류"를 선택합니다. Elastic 머신 러닝의 기본 분류 모델은 부스트 트리 회귀라고 불리는 부스팅의 일종으로 여러 개의 약한 모델을 복합 모델로 결합한 것입니다. 데이터 포인트가 특정 클래스에 속할 확률을 예측하기 위해 의사결정 트리를 사용합니다.
  • 종속 변수: 우리의 경우 "라벨", 악성인 경우 1, 양성인 경우 0.
  • 포함할 필드: 학습에 포함시키고 싶은 분야를 선택합니다. 
  • 학습 비율: 특히 대용량 데이터 세트로 작업하는 경우, 학습에 반복적인 방법을 사용하는 것이 좋습니다. (즉, 학습 비율이 적은 학습 작업을 만드는 것부터 시작해 성능을 평가하고 학습 비율을 늘릴 필요가 있는지 판단합니다.) 우리는 상당한 크기의 데이터 세트(문서 30만 개)로 작업 중이니 학습 비율을 10%부터 시작하겠습니다.
  • 추가 정보 옵션: 기본값은 그대로 두겠지만 이 단계에서 학습 작업에 대해 하이퍼파라미터를 설정하기로 선택할 수 있습니다.
  • 작업 세부 정보: 작업에 적합한 작업 ID와 대상 인덱스를 할당하겠습니다.
  • 인덱스 패턴 생성: 결과를 함께 시각화하기 위해 두 학습 작업의 대상 인덱스에 맞는 단일 인덱스 패턴을 만들 것이기 때문에 이것을 비활성화하겠습니다. 

위에서 설명한 프로세스에 따라 두 개의 분석 작업을 만들겠습니다. 하나는 바이트 히스토그램 기능만 사용하는 작업(대상 인덱스: bytes_preds)이고 다른 하나는 바이트 히스토그램을 제외한 모든 기능을 사용하는 작업(대상 인덱스: main_preds)입니다. 분석 작업은 각 기능에 대한 최적의 인코딩, 가장 잘 작동하는 기능, 모델에 대한 최적의 하이퍼파라미터를 결정합니다. 작업 진행률은 다음과 같이 Machine Learning 앱에서도 추적할 수 있습니다.

Machine Learning 앱에서 작업 진행률 추적Machine Learning 앱에서 작업 진행률 추적

Machine Learning 앱에서 작업 진행률 추적

모델 평가

작업이 완료되면 완료된 각 작업 옆에 있는 보기 버튼을 클릭하여 예측 결과를 볼 수 있습니다. 보기를 클릭하면 대상 인덱스의 내용과 모델의 혼동 행렬에 대한 데이터 프레임 스타일의 보기가 표시됩니다. 데이터 프레임의 각 행(아래에 표시)은 샘플이 학습에 사용되었는지 여부, 모델 예측, 라벨 및 클래스 확률과 점수를 나타냅니다.

main_preds 대상 인덱스의 데이터 프레임 보기

main_preds 대상 인덱스의 데이터 프레임 보기

혼동 행렬을 사용하여 두 모델의 성능을 평가하고 비교합니다. 여기서 혼동 행렬의 각 행은 실제 클래스의 인스턴스를 나타내며 각 열은 예측 클래스의 인스턴스를 나타냅니다. 따라서 정탐(true positives), 오탐(false positives)(위 행), 미탐(false negatives), 정탐(true negatives)(아래 행)의 측정치를 제공합니다.

일반, 파일 헤더 및 섹션 정보, 문자열 기능을 포함하는 모델의 혼동 행렬

일반, 파일 헤더 및 섹션 정보, 문자열 기능을 포함하는 모델의 혼동 행렬

바이트 히스토그램 기능을 사용하는 모델의 혼동 행렬

바이트 히스토그램 기능을 사용하는 모델의 혼동 행렬

두 모델 모두 정확도가 상당히 높기 때문에(적어도 시연 목적으로는!) 또 다른 학습이나 하이퍼파라미터 조정은 하지 않도록 하겠습니다. 다음 섹션에서는 Kibana에서 두 모델을 시각적으로 비교하는 방법을 살펴보고 어느 모델을 배포할 것인지 결정할 것입니다.

모델 모니터링

각 대상 인덱스에 있는 두 모델에 대한 예측을 얻으면, Kibana에서 모델 모니터링 대시보드를 만들기 위해 두 모델과 일치하는 인덱스 패턴(이 경우, *_preds)을 만듭니다. 이 예제에서 모니터링 대시보드는 다음 두 가지 용도로 사용됩니다.

  • 바이트 히스토그램 전용 모델의 성능을 다른 모델과 비교합니다. 이를 위해, 우리는 TSVB 시각화를 사용합니다.
  • 더 성능이 좋은 모델에 대해 서로 다른 행렬을 추적합니다. 예측 확률과 양성 대 악성 샘플 수를 시각화하기 위해 수직 막대 시각화를 사용하고, 오탐 비율과 미탐 비율을 추적하기 위해 TSVB를 사용합니다.

시간 경과에 따른 두 훈련된 모델의 미탐(False negative) 비율시간 경과에 따른 두 훈련된 모델의 오탐(False positive) 비율

시간 경과에 따른 훈련된 두 모델의 미탐 비율과 오탐 비율

의미 있는 시간 범위에 걸쳐 두 모델의 미탐 비율과 오탐 비율을 관찰하고, 앞 섹션에 나와 있는 혼동 행렬을 살펴봄으로써, 일반, 파일 헤더 및 섹션 정보, 문자열에 대해 학습된 모델이 더 성능이 더 좋은 모델이라는 결론을 내릴 수 있습니다. 그리고 나서 이 모델에 대해 추적하고 싶은 다양한 메트릭을 플로팅하고, 이것이 배포하고 배포 후 모니터링을 하려는 메트릭이라고 가정합니다.

Kibana에서 생성된 다양한 모델 성능 메트릭의 대시보드

실제 사용 사례에서 이러한 모니터링 대시보드를 사용하여 프로덕션을 위한 후보 모델을 비교할 수 있으며, 모델이 배포되면 프로덕션 환경에서 모델 붕괴의 지표(예: 오탐 버스트)를 식별하고 관련 응답(예: 새로운 모델 학습)을 트리거할 수 있습니다. 다음 섹션에서는 머신 러닝 프로덕션 파이프라인에서 사용하기 위해 선택한 모델을 배포하는 방법을 알아보겠습니다.

수집 시 데이터를 보강하기 위해 지도된 모델 배포

Elastic Stack은 모델 학습과 평가 외에도 사용자가 수집 파이프라인에서 학습된 모델을 사용할 수 있는 방법을 제공합니다. 이것은 머신 러닝 모델을 사용하여 수집 시 데이터를 보강할 수 있는 길을 열어줍니다. 이 섹션에서는 위에서 학습된 Malware 분류 모델을 사용해 이를 정확히 수행할 수 있는 방법을 살펴보겠습니다!

이 경우 바이너리에서 추출한 데이터 스트림을 악성 또는 양성인 데이터로 분류할 수 있다고 가정해 보세요. 이 데이터를 수집 파이프라인을 통해 Elastsearch로 수집하고 추론 프로세서에서 학습된 Malware 분류 모델을 참조할 것입니다. 

우선 추론 프로세서와 수집 파이프라인을 만들어 봅시다. 추론 프로세서에서 가장 중요한 부분은 Kibana 콘솔에서 다음과 같은 REST API 호출을 통해 확인할 수 있는 학습된 모델과 그 model_id입니다.

GET _ml/inference

이렇게 하면 클러스터의 학습된 모델 목록을 반환하고 각 모델에 대해 model_id(추론을 위해 메모해야 함), 모델을 학습시킬 때 사용된 필드, 모델이 학습된 시점 등과 같은 특성을 표시합니다.

학습된 모델에 대한 정보를 검색하기 위한 호출의 샘플 출력에 추론 프로세서를 구성하는 데 필요한 model_id가 표시됨

학습된 모델에 대한 정보를 검색하기 위한 호출의 샘플 출력에 추론 프로세서를 구성하는 데 필요한 model_id가 표시됨

클러스터에 학습된 모델이 많이 있는 경우, 모델을 학습시키는 데 사용된 데이터 프레임 분석 작업의 이름을 기반으로 하는 와일드카드 쿼리로 위의 API 호출을 실행하는 것이 도움이 될 수 있습니다. 이 경우, 우리가 고려하는 모델들은 ember_*라는 작업으로 학습되었기 때문에 다음을 실행할 수 있습니다. 

GET _ml/inference/ember_*

이렇게 하면 우리가 원하는 모델로 빠르게 범위를 좁힐 수 있습니다. 

일단 model_id를 메모하면, 수집 파이프라인 구성을 만들 수 있습니다. 전체 구성은 아래와 같습니다. 구성 블록의 제목 inference를 메모해두세요. 이것은 우리가 문서 보강에 사용하려는 모델을 참조합니다. 또한 target_field(이 경우 is_malware로 설정되었지만 물론 선호에 따라 설정될 수 있음)를 지정하고, 추론 프로세서에 의해 문서가 처리될 때 추가될 ML 필드에 접두사를 붙이는 데 사용됩니다. 

PUT _ingest/pipeline/malware-classification
{
  "description": "Classifies incoming binaries as malicious or benign",
  "processors": [
    {
      "inference": {
        "model_id": "ember_main-1598557689011",
        "target_field": "is_malware",
        "inference_config": {
          "classification": {
            "num_top_classes": 2
          }
        }
      }
    }
  ]
}

이제 바이너리의 기능으로 문서를 수집하고 있으며, 각 바이너리의 악성에 대한 예측으로 이 데이터를 보강하고자 한다고 가정합시다. 요약된 샘플 문서는 다음과 같습니다.

{ 
          "appeared" : "2020-04-01 00:00:00", 
          "byte_0" : 0.1622137576341629, 
          "byte_1" : 0.007498478516936302, 
          "byte_2" : 0.003992937505245209, 
          "byte_3" : 0.00546838915720582, 
          "byte_4" : 0.007421959958970547, 
          ... 
          "byte_253" : 0.0019106657709926367, 
          "byte_254" : 0.003551538335159421, 
          "byte_255" : 0.1782810389995575, 
          "strings_0" : 3312.0, 
          "strings_1" : 24.97675132751465, 
          "strings_2" : 82723.0, 
          "strings_3" : 0.07208394259214401, 
          "strings_4" : 8.099319529719651E-4, 
          "strings_5" : 0.005427753087133169, 
           ... 
          "strings_100" : 0.0, 
          "strings_101" : 39.0, 
          "strings_102" : 0.0, 
          "strings_103" : 9.0, 
          "general_info_0" : 1130496.0, 
          "general_info_1" : 1134592.0, 
          "general_info_2" : 1.0, 
          "general_info_3" : 0.0, 
          "general_info_4" : 247.0, 
          "general_info_5" : 1.0, 
          "general_info_6" : 1.0, 
          "general_info_7" : 1.0, 
          "general_info_8" : 1.0, 
          "general_info_9" : 0.0, 
          "file_header_0" : 1.511340288E9, 
          "file_header_1" : 0.0, 
          "file_header_2" : 0.0, 
          "file_header_3" : 0.0, 
          "file_header_4" : 0.0, 
          "file_header_5" : 0.0, 
          "file_header_6" : 1.0, 
          "file_header_7" : 0.0, 
          "file_header_8" : 0.0, 
          "file_header_9" : 0.0, 
           ... 
          "file_header_59" : 262144.0, 
          "file_header_60" : 1024.0, 
          "file_header_61" : 4096.0, 
          "sections_0" : 5.0, 
          "sections_1" : 0.0, 
          "sections_2" : 0.0, 
          "sections_3" : 1.0, 
          "sections_4" : 1.0, 
          "sections_5" : 0.0, 
           ... 
          "sections_253" : 0.0, 
          "sections_254" : 0.0 
]

우리는 위에서 만든 malware-classification 파이프라인을 통해 인덱스 API 중 하나와 파이프를 사용해 이 문서를 수집할 수 있습니다. 이 문서를 main_preds라는 대상 인덱스로 수집하는 API 호출의 예는 아래와 같습니다. 공간을 절약하기 위해 문서를 요약했습니다. 

POST main_preds/_doc?pipeline=malware-classification 
{ 
          "appeared" : "2020-04-01 00:00:00", 
          "byte_0" : 0.1622137576341629, 
          "byte_1" : 0.007498478516936302, 
          "byte_2" : 0.003992937505245209, 
          "byte_3" : 0.00546838915720582, 
          "byte_4" : 0.007421959958970547, 
          "byte_5" : 0.0025378242135047913, 
          "byte_6" : 0.002135345945134759, 
          "byte_7" : 0.001892974367365241, 
          "byte_8" : 0.007126075681298971, 
          "byte_9" : 0.001768250367604196, 
          "byte_10" : 0.0055223405789583921, 
          "byte_11" : 0.001283507444895804, 
          "byte_12" : 0.008042919423431158, 
          "byte_13" : 0.001533839968033135, 
          "byte_14" : 0.0010570581071078777, 
          "byte_15" : 0.006860705558210611, 
...

결과적으로, 우리의 대상 인덱스 main_preds에서, 우리는 이제 학습된 머신 러닝 모델의 예측으로 보강된 새로운 문서를 갖게 되었습니다. 문서를 보는 경우(예: Discover 탭을 사용), 우리의 구성에 따라 추론 프로세서가 학습된 머신 러닝 모델의 예측을 문서에 추가했음을 보게 됩니다. 이 경우, 우리의 문서(악성 또는 양성으로 분류하고자 하는 알 수 없는 바이너리를 나타냄)가 클래스 1로 할당되었는데, 이는 우리 모델이 이 바이너리가 악성일 것으로 예측한다는 것을 나타냅니다. 

수집된 문서의 한 조각은 학습된 머신 러닝 모델에서 보강된 것을 보여줍니다.

수집된 문서의 한 조각은 학습된 머신 러닝 모델에서 보강된 것을 보여줍니다.

예측이 포함된 새로운 문서가 대상 인덱스에 추가되면 Kibana 대시보드에 의해 자동으로 선택되므로, 학습된 모델이 시간이 지남에 따라 새로운 샘플에서 어떻게 작동하고 있는지에 대한 인사이트를 제공해줍니다.

결론

프로덕션 환경에서는 모델 배포와 함께 책임이 끝나지 않습니다. (끝나서도 안됩니다!) 파이프라인에는 모델이 고객 환경에 도달하기 전에 효과적으로 평가하고 일단 모델이 배포되면 면밀히 모니터링할 수 있는 방법이 필요합니다. 이는 데이터 과학 팀이 실제로 문제를 예측하고 모델 붕괴 지표가 있을 때 필요한 조치를 취하도록 도와줍니다.

이 블로그 포스팅에서는 뛰어난 저장 공간 기능, 모델 학습, 기본으로 제공되는 조정 기능, Kibana의 풍부한 시각화 도구 모음 등을 갖추고 있다는 점에서 Elastic Stack이 이러한 엔드 투 엔드 머신 러닝 파이프라인을 관리하기 위한 훌륭한 플랫폼인 이유를 살펴보았습니다.