<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Electronic Artist</title>
    <link>https://eartist.tistory.com/</link>
    <description>Acoustics, Switching, Media, Embedded System</description>
    <language>ko</language>
    <pubDate>Sat, 1 Aug 2026 13:55:53 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>Jay.P Morgan</managingEditor>
    <image>
      <title>Electronic Artist</title>
      <url>https://tistory1.daumcdn.net/tistory/6334908/attach/ba6e5ddd8c0346a98ffd083a3d466823</url>
      <link>https://eartist.tistory.com</link>
    </image>
    <item>
      <title>NUMA</title>
      <link>https://eartist.tistory.com/1323</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;NUMA (Non-Uniform Memory Access)&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;NUMA:&amp;nbsp;하드웨어&amp;nbsp;토폴로지(Topology), ACPI SRAT/SLIT, pglist_data,&amp;nbsp;메모리&amp;nbsp;정책(Memory Policy)(mbind/set_mempolicy), Automatic NUMA Balancing, NUMA-aware&amp;nbsp;스케줄링, numactl, CXL, vNUMA를&amp;nbsp;다룹니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;# 분산 및 클라우드 컴퓨팅&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;NUMA&amp;nbsp;하드웨어&amp;nbsp;토폴로지, ACPI&amp;nbsp;테이블&amp;nbsp;파싱,&amp;nbsp;커널&amp;nbsp;자료구조,&amp;nbsp;메모리&amp;nbsp;정책, Automatic NUMA Balancing, NUMA-aware&amp;nbsp;스케줄링, CXL&amp;nbsp;확장까지&amp;nbsp;&amp;mdash;&amp;nbsp;비균일&amp;nbsp;메모리&amp;nbsp;접근&amp;nbsp;아키텍처를&amp;nbsp;소스&amp;nbsp;코드&amp;nbsp;수준에서&amp;nbsp;분석합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;관련&amp;nbsp;표준&lt;/span&gt;:&lt;/b&gt;&amp;nbsp;ACPI 6.5 (SRAT/SLIT/HMAT&amp;nbsp;테이블), JEDEC DDR5 (메모리&amp;nbsp;채널&amp;nbsp;구조), CXL 3.1 (캐시일관성(Cache Coherency)&amp;nbsp;인터커넥트) &amp;mdash; NUMA&amp;nbsp;토폴로지&amp;nbsp;탐색과&amp;nbsp;메모리&amp;nbsp;접근에&amp;nbsp;관련된&amp;nbsp;핵심&amp;nbsp;규격입니다.&amp;nbsp;종합&amp;nbsp;목록은&amp;nbsp;&lt;a style=&quot;color: #333333;&quot; href=&quot;https://www.minzkn.com/linuxkernel/pages/references.html#std-memory&quot;&gt;참고자료&amp;nbsp;&amp;mdash;&amp;nbsp;표준&amp;nbsp;&amp;amp;&amp;nbsp;규격&lt;/a&gt;&amp;nbsp;섹션을&amp;nbsp;참고하세요.&lt;/span&gt;&lt;/blockquote&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #1b711d;&quot;&gt;참고&lt;/span&gt;:&lt;/b&gt;&amp;nbsp;NUMA의&amp;nbsp;기초&amp;nbsp;개념과&amp;nbsp;&lt;b&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;pg_data_t&lt;/span&gt;&lt;/b&gt;&amp;nbsp;개요는&amp;nbsp;&lt;a style=&quot;color: #333333;&quot; href=&quot;https://www.minzkn.com/linuxkernel/pages/memory.html#numa-overview&quot;&gt;메모리&amp;nbsp;관리(Memory Management) &amp;mdash; NUMA&amp;nbsp;섹션&lt;/a&gt;을, Hugepage와&amp;nbsp;NUMA&amp;nbsp;연동은&amp;nbsp;&lt;a style=&quot;color: #333333;&quot; href=&quot;https://www.minzkn.com/linuxkernel/pages/hugepages.html#numa&quot;&gt;Huge Pages &amp;mdash; NUMA&amp;nbsp;섹션&lt;/a&gt;을&amp;nbsp;참조하세요.&lt;/span&gt;&lt;/blockquote&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;border-left: #0B2161 10px solid; padding-right: 10px; border-bottom: #0B2161 2px solid; pading-bottom: px; padding-top: 0px; margin: 10px 0px 5px; line-height: 30px;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;b&gt;1. 초보자 가이드&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;전제&amp;nbsp;조건&lt;/span&gt;:&lt;/b&gt;&amp;nbsp;&lt;a style=&quot;color: #333333;&quot; href=&quot;https://www.minzkn.com/linuxkernel/pages/memory.html&quot;&gt;메모리&amp;nbsp;관리&amp;nbsp;개요&lt;/a&gt;와&amp;nbsp;&lt;a style=&quot;color: #333333;&quot; href=&quot;https://www.minzkn.com/linuxkernel/pages/cpu-cache.html&quot;&gt;CPU&amp;nbsp;캐시(Cache)&lt;/a&gt;&amp;nbsp;문서를&amp;nbsp;먼저&amp;nbsp;읽으세요.&amp;nbsp;메모리&amp;nbsp;서브시스템은&amp;nbsp;가상메모리(Virtual Memory)와&amp;nbsp;물리&amp;nbsp;메모리(Physical Memory)&amp;nbsp;정책이&amp;nbsp;동시에&amp;nbsp;동작하므로,&amp;nbsp;주소&amp;nbsp;변환(Address Translation)과&amp;nbsp;회수&amp;nbsp;정책을&amp;nbsp;같이&amp;nbsp;보는&amp;nbsp;관점이&amp;nbsp;필요합니다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #1b711d;&quot;&gt;일상&amp;nbsp;비유&lt;/span&gt;:&lt;/b&gt; 이 개념은 여러 창고가 있는 공장에서 가까운 창고를 우선 쓰는 것과 비슷합니다. 가까운 창고물건이 더 빨리 오듯이, NUMA도 현재 CPU에 가까운 메모리 노드를 먼저 쓰는 편이 지연이 적습니다. &amp;nbsp; # 컴퓨터 메모리&lt;/span&gt;&lt;/blockquote&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; 1.1 &amp;nbsp;핵심 요약&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;NUMA&lt;/b&gt;&amp;nbsp;&amp;mdash;&amp;nbsp;메모리&amp;nbsp;접근&amp;nbsp;시간이&amp;nbsp;CPU와&amp;nbsp;메모리의&amp;nbsp;물리적&amp;nbsp;위치에&amp;nbsp;따라&amp;nbsp;달라지는&amp;nbsp;아키텍처입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;Node&lt;/b&gt;&amp;nbsp;&amp;mdash;&amp;nbsp;&lt;a style=&quot;color: #333333;&quot; href=&quot;https://www.minzkn.com/linuxkernel/pages/numa.html&quot;&gt;&amp;nbsp;CPU&lt;/a&gt;&amp;nbsp;소켓(Socket)과&amp;nbsp;로컬&amp;nbsp;메모리를&amp;nbsp;묶은&amp;nbsp;단위.&amp;nbsp;커널에서&amp;nbsp;pglist_data&amp;nbsp;구조체(Struct)로표현됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;SRAT/SLIT&lt;/b&gt;&amp;nbsp;&amp;mdash; ACPI&amp;nbsp;테이블로&amp;nbsp;NUMA&amp;nbsp;토폴로지(노드&amp;nbsp;구성)와&amp;nbsp;거리(접근&amp;nbsp;지연(Latency))를&amp;nbsp;커널에전달합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;메모리&lt;/b&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;b&gt;정책&lt;/b&gt;&amp;nbsp;&amp;mdash;&amp;nbsp;mbind()/set_mempolicy()로&amp;nbsp;프로세스(Process)의&amp;nbsp;메모리&amp;nbsp;할당&amp;nbsp;노드를&amp;nbsp;제어합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;NUMA Balancing&lt;/b&gt;&amp;nbsp;&amp;mdash;&amp;nbsp;커널이&amp;nbsp;자동으로&amp;nbsp;페이지(Page)를&amp;nbsp;자주&amp;nbsp;접근하는&amp;nbsp;CPU&amp;nbsp;노드로마이그레이션합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; 1.2 &amp;nbsp;단계별 이해&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;&amp;nbsp; ① 토폴로지&lt;/b&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;b&gt;확인&lt;/b&gt;&amp;nbsp;&amp;mdash;&amp;nbsp;&lt;b&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;numactl --hardware&lt;/span&gt;&lt;/b&gt;로&amp;nbsp;시스템의&amp;nbsp;NUMA&amp;nbsp;노드&amp;nbsp;수,&amp;nbsp;각&amp;nbsp;노드의&amp;nbsp;CPU와&amp;nbsp;메모리&amp;nbsp;크기를확인합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #666666;&quot;&gt;커널 함수: &lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;acpi_numa_init()&lt;/b&gt;&lt;/span&gt; &amp;rarr; &lt;b&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;acpi_parse_srat()&lt;/span&gt;&lt;/b&gt;가 SRAT 테이블을 파싱하여 &lt;b&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;numa_meminfo&lt;/span&gt;&lt;/b&gt;에 노드 정보를저장합니다. &amp;nbsp; # 컴퓨터 하드웨어&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;&amp;nbsp; &lt;b&gt;② &lt;/b&gt;로컬&lt;/b&gt;&lt;b&gt;&amp;nbsp;vs&amp;nbsp;&lt;/b&gt;&lt;b&gt;원격&lt;/b&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;b&gt;접근&lt;/b&gt;&amp;nbsp;&amp;mdash;&amp;nbsp;같은&amp;nbsp;노드의&amp;nbsp;메모리&amp;nbsp;접근은&amp;nbsp;빠르고(~80ns),&amp;nbsp;다른&amp;nbsp;노드&amp;nbsp;접근은&amp;nbsp;느립니다(~140ns).&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #666666;&quot;&gt;커널 구조체: &lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;numa_distance[][]&lt;/b&gt;&lt;/span&gt; 배열에 SLIT 기반 노드 간 거리가 저장됩니다. &lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;numastat&lt;/b&gt;&lt;/span&gt;으로 노드별 할당통계를 모니터링할 수 있습니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;&amp;nbsp; &lt;b&gt;&lt;b&gt;③ &lt;/b&gt;&lt;/b&gt;정책&lt;/b&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;b&gt;적용&lt;/b&gt;&amp;nbsp;&amp;mdash;&amp;nbsp;&lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;numactl --cpubind=0 --membind=0 ./app&lt;/b&gt;&lt;/span&gt;으로&amp;nbsp;특정&amp;nbsp;노드에&amp;nbsp;CPU와&amp;nbsp;메모리를&amp;nbsp;바인딩합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #666666;&quot;&gt;커널 함수: &lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;do_set_mempolicy()&lt;/b&gt;&lt;/span&gt;가 &lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;struct mempolicy&lt;/b&gt;&lt;/span&gt;를 태스크(Task)에 설정하고, &lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;alloc_pages_mpol()&lt;/b&gt;&lt;/span&gt;이 할당 시정책을 적용합니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;&amp;nbsp; &lt;b&gt;&lt;b&gt;&lt;b&gt;④ &lt;/b&gt;&lt;/b&gt;&lt;/b&gt;커널&lt;/b&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;b&gt;자동&lt;/b&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;b&gt;밸런싱&lt;/b&gt;&amp;nbsp;&amp;mdash;&amp;nbsp;&lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;/proc/sys/kernel/numa_balancing&lt;/b&gt;&lt;/span&gt;으로&amp;nbsp;자동&amp;nbsp;마이그레이션을&amp;nbsp;활성화/비활성화합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #666666;&quot;&gt;커널 함수: &lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;task_tick_numa()&lt;/b&gt;&lt;/span&gt; &amp;rarr; &lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;task_numa_work()&lt;/b&gt;&lt;/span&gt; &amp;rarr; VMA 스캔&amp;rarr; &lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;do_numa_page()&lt;/b&gt;&lt;/span&gt; &amp;rarr; &lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;task_numa_fault()&lt;/b&gt;&lt;/span&gt; &amp;rarr; &lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;migrate_misplaced_folio()&lt;/b&gt;&lt;/span&gt; 체인으로 페이지를 최적 노드로이동시킵니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;border-left: #0B2161 10px solid; padding-right: 10px; border-bottom: #0B2161 2px solid; pading-bottom: px; padding-top: 0px; margin: 10px 0px 5px; line-height: 30px;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;b&gt;2. NUMA 탄생 배경과 기초 개념&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;NUMA를&amp;nbsp;제대로&amp;nbsp;이해하려면&amp;nbsp;먼저&amp;nbsp;&lt;b&gt;왜&lt;/b&gt;&lt;b&gt;&amp;nbsp;NUMA&lt;/b&gt;&lt;b&gt;가&lt;/b&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;b&gt;필요하게&lt;/b&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;b&gt;되었는지&lt;/b&gt;와&amp;nbsp;&lt;b&gt;로컬&lt;/b&gt;&lt;b&gt;/&lt;/b&gt;&lt;b&gt;원격&lt;/b&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;b&gt;메모리&lt;/b&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;b&gt;접근이&lt;/b&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;b&gt;실제로&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;b&gt;어떻게&lt;/b&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;b&gt;다른지&lt;/b&gt;를 파악해야 합니다. 이 섹션에서는 기초 개념, 핵심 용어, 그리고 실제 성능 영향을 설명합니다. &amp;nbsp; &amp;nbsp;# 소프트웨어&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; 2.1 &amp;nbsp;UMA에서 NUMA&lt;b&gt;로&lt;/b&gt;&lt;b&gt;&amp;nbsp;&amp;mdash;&amp;nbsp;&lt;/b&gt;&lt;b&gt;확장성&lt;/b&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;b&gt;한계의&lt;/b&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;b&gt;해결&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;초창기&amp;nbsp;다중&amp;nbsp;&lt;a style=&quot;color: #333333;&quot; href=&quot;https://www.minzkn.com/linuxkernel/pages/numa.html&quot;&gt;&amp;nbsp;프로세서&lt;/a&gt;&amp;nbsp;시스템은&amp;nbsp;&lt;b&gt;UMA(Uniform Memory Access,&amp;nbsp;&lt;/b&gt;&lt;b&gt;균일&lt;/b&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;b&gt;메모리&lt;/b&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;b&gt;접근&lt;/b&gt;&lt;b&gt;)&lt;/b&gt;&amp;nbsp;구조를&amp;nbsp;사용했습니다.&amp;nbsp;모든&amp;nbsp;CPU가&amp;nbsp;하나의&amp;nbsp;공유&amp;nbsp;메모리&amp;nbsp;버스를&amp;nbsp;통해&amp;nbsp;동일한&amp;nbsp;메모리에&amp;nbsp;접근하므로&amp;nbsp;구현이&amp;nbsp;단순하고&amp;nbsp;프로그래밍모델도&amp;nbsp;직관적입니다.&amp;nbsp;그러나&amp;nbsp;CPU&amp;nbsp;수가&amp;nbsp;증가할수록&amp;nbsp;공유&amp;nbsp;버스(Bus)&amp;nbsp;경합(Contention)이&amp;nbsp;기하급수적으로증가하며, 8~16코어를&amp;nbsp;넘어서면&amp;nbsp;메모리&amp;nbsp;버스가&amp;nbsp;포화되어&amp;nbsp;추가&amp;nbsp;CPU가&amp;nbsp;오히려&amp;nbsp;전체&amp;nbsp;처리량을&amp;nbsp;떨어뜨립니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;NUMA(Non-Uniform Memory Access,&amp;nbsp;&lt;/b&gt;&lt;b&gt;비균일&lt;/b&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;b&gt;메모리&lt;/b&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;b&gt;접근&lt;/b&gt;&lt;b&gt;)&lt;/b&gt;는&amp;nbsp;이&amp;nbsp;병목(Bottleneck)을&amp;nbsp;해결하기&amp;nbsp;위해&amp;nbsp;각&amp;nbsp;CPU&amp;nbsp;소켓(또는&amp;nbsp;CPU&amp;nbsp;그룹)에&amp;nbsp;자신만의&amp;nbsp;로컬&amp;nbsp;메모리를&amp;nbsp;독립적으로&amp;nbsp;붙이는&amp;nbsp;방식으로&amp;nbsp;설계되었습니다.&amp;nbsp;로컬&amp;nbsp;메모리는높은&amp;nbsp;대역폭과&amp;nbsp;낮은&amp;nbsp;지연&amp;nbsp;시간으로&amp;nbsp;접근할&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;반면&amp;nbsp;다른&amp;nbsp;소켓의&amp;nbsp;메모리(원격&amp;nbsp;메모리, Remote Memory)에&amp;nbsp;접근하려면&amp;nbsp;소켓&amp;nbsp;간&amp;nbsp;인터커넥트(Intel UPI, AMD Infinity Fabric&amp;nbsp;등)를&amp;nbsp;경유해야&amp;nbsp;하므로&amp;nbsp;추가&amp;nbsp;지연이발생합니다.&amp;nbsp;어느&amp;nbsp;메모리에&amp;nbsp;접근하느냐에&amp;nbsp;따라&amp;nbsp;속도가&amp;nbsp;달라지므로&amp;nbsp;&quot;비균일&quot;이라는&amp;nbsp;이름이&amp;nbsp;붙었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-07-23 오후 2.21.46.png&quot; data-origin-width=&quot;1846&quot; data-origin-height=&quot;678&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/coBMol/dJMcaazogzL/so2Vd25PCGtNM7HQpl5A51/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/coBMol/dJMcaazogzL/so2Vd25PCGtNM7HQpl5A51/img.png&quot; data-alt=&quot;UMA vs NUMA&amp;amp;nbsp; 비교 &amp;amp;nbsp;&amp;amp;mdash;&amp;amp;nbsp; 공유 &amp;amp;nbsp; 버스 &amp;amp;nbsp; 병목 (UMA) 과 &amp;amp;nbsp; 분산 &amp;amp;nbsp; 로컬 &amp;amp;nbsp; 메모리 (NUMA) 의 &amp;amp;nbsp; 차이&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/coBMol/dJMcaazogzL/so2Vd25PCGtNM7HQpl5A51/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcoBMol%2FdJMcaazogzL%2Fso2Vd25PCGtNM7HQpl5A51%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1846&quot; height=&quot;678&quot; data-filename=&quot;스크린샷 2026-07-23 오후 2.21.46.png&quot; data-origin-width=&quot;1846&quot; data-origin-height=&quot;678&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;UMA vs NUMA&amp;nbsp; 비교 &amp;nbsp;&amp;mdash;&amp;nbsp; 공유 &amp;nbsp; 버스 &amp;nbsp; 병목 (UMA) 과 &amp;nbsp; 분산 &amp;nbsp; 로컬 &amp;nbsp; 메모리 (NUMA) 의 &amp;nbsp; 차이&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;# &amp;nbsp; &amp;nbsp;컴퓨터 과학&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;역사적&amp;nbsp;배경&lt;/span&gt;:&lt;/b&gt;&amp;nbsp;NUMA는&amp;nbsp;1990년대&amp;nbsp;초&amp;nbsp;SGI(Silicon Graphics)의&amp;nbsp;대형&amp;nbsp;서버에서&amp;nbsp;처음&amp;nbsp;상용화되었습니다. Linux&amp;nbsp;커널은&amp;nbsp;2.5.x&amp;nbsp;개발&amp;nbsp;시리즈(2002년)부터&amp;nbsp;본격적인&amp;nbsp;NUMA&amp;nbsp;지원을&amp;nbsp;추가했으며,&amp;nbsp;오늘날&amp;nbsp;2개&amp;nbsp;이상의&amp;nbsp;CPU&amp;nbsp;소켓을가진&amp;nbsp;서버는&amp;nbsp;대부분&amp;nbsp;NUMA&amp;nbsp;아키텍처를&amp;nbsp;사용합니다. AMD EPYC는&amp;nbsp;단일&amp;nbsp;소켓에서도&amp;nbsp;여러&amp;nbsp;NUMA&amp;nbsp;노드를구성하는&amp;nbsp;NPS&amp;nbsp;기능으로&amp;nbsp;더&amp;nbsp;세밀한&amp;nbsp;메모리&amp;nbsp;로컬리티를&amp;nbsp;제공합니다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; 2.2 &lt;b&gt;NUMA&amp;nbsp;&lt;/b&gt;&lt;b&gt;핵심&lt;/b&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;b&gt;용어&lt;/b&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;b&gt;정리&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;NUMA&amp;nbsp;문서와&amp;nbsp;커널&amp;nbsp;코드&amp;nbsp;전반에서&amp;nbsp;반복적으로&amp;nbsp;등장하는&amp;nbsp;핵심&amp;nbsp;용어를&amp;nbsp;정리합니다.&amp;nbsp;이&amp;nbsp;용어들을&amp;nbsp;먼저&amp;nbsp;익혀두면이후&amp;nbsp;섹션을&amp;nbsp;훨씬&amp;nbsp;쉽게&amp;nbsp;이해할&amp;nbsp;수&amp;nbsp;있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;color: #000000; text-align: start; border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; width=&quot;763&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style13&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;용어&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;설명&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;커널 표현&amp;nbsp;/&amp;nbsp;확인 명령&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;노드&amp;nbsp;(Node)&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;CPU&amp;nbsp;소켓과 그에 직접 연결된 로컬 메모리를 묶은 단위. NUMA&amp;nbsp;시스템의 기본 구성 요소&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;pg_data_t,&amp;nbsp;NODE_DATA(nid)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;로컬 메모리(Local Memory)&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;현재 실행 중인&amp;nbsp;CPU와 같은 노드에 있는 메모리.&amp;nbsp;접근 지연이 가장 낮고 대역폭이 높음&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;numa_node_id(),&amp;nbsp;numastat의&amp;nbsp;local_node&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;원격 메모리(Remote Memory)&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;다른 노드에 있는 메모리.&amp;nbsp;인터커넥트를 경유하므로 로컬보다&amp;nbsp;1.5~3배 느림&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;numastat의&amp;nbsp;other_node,&amp;nbsp;numa_miss&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;NUMA&amp;nbsp;&lt;/b&gt;&lt;b&gt;거리(Distance)&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;노드 간 상대적 접근 비용.&amp;nbsp;자기 자신은 항상10,&amp;nbsp;값이 클수록 접근이 느림&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;numa_distance[][], SLIT&amp;nbsp;테이블,&amp;nbsp;numactl -H&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;NUMA Ratio&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;원격 거리&amp;nbsp;/&amp;nbsp;로컬 거리 비율. 2.0&amp;nbsp;이상이면NUMA&amp;nbsp;최적화가 성능에 큰 영향을 미침&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;numactl --hardware의&amp;nbsp;node distances로 계산&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;NUMA Hit / Miss&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;로컬 노드에서 메모리 할당 성공(Hit) vs&amp;nbsp;원격 노드로 폴백(Miss).&amp;nbsp;낮은&amp;nbsp;Miss&amp;nbsp;비율이 좋음&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;/proc/vmstat의&amp;nbsp;numa_hit,&amp;nbsp;numa_miss&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;NUMA Balancing&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;커널이 자동으로 페이지를 접근이 잦은&amp;nbsp;CPU&amp;nbsp;노드로 이동시키는 메커니즘.&amp;nbsp;장기 실행 프로세스의 로컬리티를 자동으로 개선&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;/proc/sys/kernel/numa_balancing&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;메모리 정책(Memory Policy)&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;메모리 할당 시 어떤 노드를 선택할지 규칙. DEFAULT, BIND, INTERLEAVE, PREFERRED&amp;nbsp;등&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;struct mempolicy,&amp;nbsp;mbind(),&amp;nbsp;numactl&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;로컬리티(Locality)&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;CPU와 접근하는 메모리가 같은 노드에 있어 빠르게 접근 가능한 상태.&amp;nbsp;좋은 로컬리티&amp;nbsp;=&amp;nbsp;높은 성능&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;NUMA Balancing이 자동으로 개선 시도&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;NUMA&amp;nbsp;&lt;/b&gt;&lt;b&gt;친화성(Affinity)&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;특정 프로세스나 스레드를 특정 노드에서 실행하도록 바인딩하는 것&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;numactl --cpubind,&amp;nbsp;set_mempolicy()&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; 2.3 &amp;nbsp;&lt;b&gt;로컬&lt;/b&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;b&gt;메모리와&lt;/b&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;b&gt;원격&lt;/b&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;b&gt;메모리의&lt;/b&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;b&gt;성능&lt;/b&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;b&gt;차이&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;NUMA의&amp;nbsp;핵심은&amp;nbsp;&lt;b&gt;&quot;&lt;/b&gt;&lt;b&gt;어디서&lt;/b&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;b&gt;메모리를&lt;/b&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;b&gt;할당받았는가&lt;/b&gt;&lt;b&gt;&quot;&lt;/b&gt;&lt;b&gt;가&lt;/b&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;b&gt;성능에&lt;/b&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;b&gt;직접&lt;/b&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;b&gt;영향을&lt;/b&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;b&gt;미친다&lt;/b&gt;는 점입니다. 같은 물리메모리라도 어느 CPU(소켓)에서 접근하느냐에 따라 지연 시간과 대역폭이 크게 달라집니다. 다음 예제는Node 0에서 실행 중인 프로세스가 로컬(Node 0)과 원격(Node 1) 메모리에 각각 접근할 때의 성능 차이를측정합니다. &amp;nbsp; &amp;nbsp;# 칩 및 프로세서&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1784784342405&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/* NUMA 로컬/원격 메모리 대역폭 측정 예제
 * 빌드: gcc -O2 -o numa_bench numa_bench.c -lnuma
 * 실행: numactl --cpubind=0 ./numa_bench
 */
#define _GNU_SOURCE
#include &amp;lt;numa.h&amp;gt;
#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;string.h&amp;gt;
#include &amp;lt;time.h&amp;gt;
#define BUF_SIZE  (256UL * 1024 * 1024)  /* 256 MB */
#define ITERS     10
static double bench_bandwidth(char *buf, size_t size)
{
    struct timespec t0, t1;
    volatile long sum = 0;
    memset(buf, 0, size);  /* 첫 접근으로 페이지 폴트 처리 */
    clock_gettime(CLOCK_MONOTONIC, &amp;amp;t0);
    for (int it = 0; it &amp;lt; ITERS; it++)
        for (size_t j = 0; j &amp;lt; size; j += 64)  /* 캐시 라인 단위 순차 읽기 */
            sum += *(volatile long *)(buf + j);
    clock_gettime(CLOCK_MONOTONIC, &amp;amp;t1);
    double elapsed = (t1.tv_sec - t0.tv_sec) +
                    (t1.tv_nsec - t0.tv_nsec) * 1e-9;
    return (double)(size * ITERS) / elapsed / (1024.0 * 1024 * 1024);
}
int main(void)
{
    if (numa_available() &amp;lt; 0 || numa_max_node() &amp;lt; 1) {
        fputs(&quot;NUMA 미지원 또는 단일 노드 시스템\n&quot;, stderr);
        return 1;
    }
    numa_run_on_node(0);  /* 현재 스레드를 Node 0에 고정 */
    /* Node 0 메모리 할당 &amp;rarr; CPU 0 기준 로컬 접근 */
    char *local_buf  = numa_alloc_onnode(BUF_SIZE, 0);
    /* Node 1 메모리 할당 &amp;rarr; CPU 0 기준 원격 접근 */
    char *remote_buf = numa_alloc_onnode(BUF_SIZE, 1);
    double local_bw  = bench_bandwidth(local_buf,  BUF_SIZE);
    double remote_bw = bench_bandwidth(remote_buf, BUF_SIZE);
    printf(&quot;로컬  메모리 대역폭: %.1f GB/s  (Node 0 &amp;rarr; Node 0)\n&quot;, local_bw);
    printf(&quot;원격  메모리 대역폭: %.1f GB/s  (Node 0 &amp;rarr; Node 1)\n&quot;, remote_bw);
    printf(&quot;성능 비율: %.2fx 차이\n&quot;, local_bw / remote_bw);
    numa_free(local_buf,  BUF_SIZE);
    numa_free(remote_buf, BUF_SIZE);
    return 0;
}
/* 일반적 출력 결과:
 * Intel 2소켓 Xeon (DDR4-3200):
 *   로컬  메모리 대역폭: 48.3 GB/s  (Node 0 &amp;rarr; Node 0)
 *   원격  메모리 대역폭: 28.7 GB/s  (Node 0 &amp;rarr; Node 1)
 *   성능 비율: 1.68x 차이
 *
 * AMD EPYC 2소켓 (NPS1, DDR5-4800):
 *   로컬  메모리 대역폭: 62.1 GB/s
 *   원격  메모리 대역폭: 38.4 GB/s
 *   성능 비율: 1.62x 차이
 */&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;왜&amp;nbsp;원격&amp;nbsp;메모리가&amp;nbsp;느린가&lt;/span&gt;:&lt;/b&gt;&amp;nbsp;원격&amp;nbsp;메모리&amp;nbsp;접근은&amp;nbsp;(1)&amp;nbsp;로컬&amp;nbsp;메모리&amp;nbsp;컨트롤러가&amp;nbsp;요청&amp;nbsp;수신&amp;nbsp;&amp;rarr; (2)&amp;nbsp;소켓&amp;nbsp;간인터커넥트(UPI/IF)로&amp;nbsp;패킷(Packet)&amp;nbsp;전송&amp;nbsp;&amp;rarr; (3)&amp;nbsp;원격&amp;nbsp;소켓의&amp;nbsp;메모리&amp;nbsp;컨트롤러에서&amp;nbsp;&lt;a style=&quot;color: #333333;&quot; href=&quot;https://www.minzkn.com/linuxkernel/pages/numa.html&quot;&gt;&amp;nbsp;데이터&lt;/a&gt; 읽기&amp;nbsp;&amp;rarr; (4)&amp;nbsp;인터커넥트로&amp;nbsp;응답&amp;nbsp;반환의&amp;nbsp;과정을&amp;nbsp;거칩니다.&amp;nbsp;각&amp;nbsp;단계에서&amp;nbsp;수십&amp;nbsp;나노초가&amp;nbsp;추가됩니다.&amp;nbsp;일반적으로&amp;nbsp;원격&amp;nbsp;접근은 로컬&amp;nbsp;접근보다&amp;nbsp;&lt;b&gt;지연&amp;nbsp;시간&amp;nbsp;1.5~3배,&amp;nbsp;대역폭&amp;nbsp;50~70%&amp;nbsp;수준&lt;/b&gt;입니다. &amp;nbsp; &amp;nbsp;# 분산 및 클라우드 컴퓨팅&lt;/span&gt;&lt;/blockquote&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; 2.4 &amp;nbsp;&lt;b&gt;NUMA&lt;/b&gt;&lt;b&gt;가&lt;/b&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;b&gt;성능에&lt;/b&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;b&gt;영향을&lt;/b&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;b&gt;미치는&lt;/b&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;b&gt;상황&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;모든&amp;nbsp;프로그램이&amp;nbsp;NUMA를&amp;nbsp;의식해야&amp;nbsp;하는&amp;nbsp;것은&amp;nbsp;아닙니다.&amp;nbsp;다음&amp;nbsp;표를&amp;nbsp;참고하여&amp;nbsp;NUMA&amp;nbsp;최적화가&amp;nbsp;실질적으로필요한지&amp;nbsp;판단하세요.&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;color: #000000; text-align: start; border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; width=&quot;763&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style13&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;상황&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;NUMA&amp;nbsp;&lt;/b&gt;&lt;b&gt;영향도&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;권장 조치&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;단일 소켓 서버&amp;nbsp;(1S)&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;없음&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;NUMA&amp;nbsp;고려 불필요&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;2소켓 서버,&amp;nbsp;소규모 단일 프로세스&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;낮음&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;기본 설정(Automatic NUMA Balancing)으로 충분&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;2소켓 서버,&amp;nbsp;메모리 대역폭 집약 워크로드(HPC, DB, ML&amp;nbsp;추론)&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;높음&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;numactl --cpubind=N --membind=N으로 노드 고정&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;4소켓 이상 대형 서버,&amp;nbsp;멀티 인스턴스DB/캐시&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;매우 높음&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;인스턴스당 노드 분리,&amp;nbsp;mbind()&amp;nbsp;적극 적용&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;AMD EPYC NPS4 (소켓 내&amp;nbsp;4노드 분할)&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;높음&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;단일 소켓에서도 원격 메모리 발생, NUMA-aware&amp;nbsp;배치 필요&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Redis, Memcached&amp;nbsp;등 단일 스레드 캐시 서버&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;중간&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;인스턴스를 노드별로 분리 운영(numactl --cpubind=N)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;컨테이너/VM (vNUMA)&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;중간~높음&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;vNUMA&amp;nbsp;토폴로지를 호스트와 일치시켜 구성&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Nginx, Apache&amp;nbsp;멀티 프로세스 웹 서버&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;낮음~중간&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;자동&amp;nbsp;NUMA Balancing으로 충분한 경우가 많음&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;NUMA&amp;nbsp;문제&amp;nbsp;증상&amp;nbsp;&amp;mdash;&amp;nbsp;다음&amp;nbsp;증상이&amp;nbsp;보이면&amp;nbsp;NUMA&amp;nbsp;점검&lt;/span&gt;:&lt;br /&gt;&lt;/b&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;bull;&amp;nbsp;&amp;nbsp;numastat에서 numa_miss / (numa_hit + numa_miss) 비율이 5% 이상&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;bull;&amp;nbsp;&amp;nbsp;&lt;a style=&quot;color: #333333;&quot; href=&quot;https://www.minzkn.com/linuxkernel/pages/numa.html&quot;&gt;&amp;nbsp;CPU&lt;/a&gt;&amp;nbsp;사용률은&amp;nbsp;낮은데&amp;nbsp;메모리&amp;nbsp;대기&amp;nbsp;시간(Latency)이&amp;nbsp;높은&amp;nbsp;상태&amp;nbsp;(sar -B&amp;nbsp;또는&amp;nbsp;perf stat)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;bull;&amp;nbsp;&amp;nbsp;소켓&amp;nbsp;0은&amp;nbsp;메모리가&amp;nbsp;거의&amp;nbsp;없고&amp;nbsp;소켓&amp;nbsp;1은&amp;nbsp;여유가&amp;nbsp;많은&amp;nbsp;불균형&amp;nbsp;상태&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;bull;&amp;nbsp;&amp;nbsp;서비스&amp;nbsp;시작&amp;nbsp;후&amp;nbsp;한동안&amp;nbsp;성능이&amp;nbsp;낮다가&amp;nbsp;점점&amp;nbsp;올라가는&amp;nbsp;현상&amp;nbsp;(NUMA Balancing&amp;nbsp;적응&amp;nbsp;중)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;bull;&amp;nbsp;&amp;nbsp;perf stat에서&amp;nbsp;mem_load_retired.remote_dram&amp;nbsp;이벤트&amp;nbsp;비율이&amp;nbsp;높음&amp;nbsp;(Intel)&lt;/span&gt;&lt;/blockquote&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; 2.5 &amp;nbsp;&lt;b&gt;내&lt;/b&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;b&gt;시스템&lt;/b&gt;&lt;b&gt;&amp;nbsp;NUMA&amp;nbsp;&lt;/b&gt;&lt;b&gt;현황&lt;/b&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;b&gt;첫&lt;/b&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;b&gt;진단&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;NUMA 시스템을 처음 다룬다면 다음 순서로 진단을 시작하세요. 각 명령의 출력을 어떻게 해석해야 하는지도함께 설명합니다. &amp;nbsp;# 운영체제&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1784784676335&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# ① NUMA 시스템인지 먼저 확인
$ numactl --hardware
available: 2 nodes (0-1)   # 2개 이상이면 NUMA 시스템
node 0 cpus: 0 1 2 3 4 5 6 7 # Node 0에 속한 CPU 번호
node 0 size: 65536 MB         # Node 0의 물리 메모리 용량
node 0 free: 48230 MB         # Node 0의 현재 여유 메모리
node 1 cpus: 8 9 10 11 12 13 14 15
node 1 size: 65536 MB
node 1 free: 51200 MB
node distances:               # NUMA 거리 매트릭스
node   0   1
  0:  10  21                # 10=로컬, 21=Node 1로의 원격 거리
  1:  21  10                # NUMA Ratio = 21/10 = 2.1 &amp;rarr; 최적화 강력 권장
# ② 현재 NUMA Miss 통계 확인 (miss 비율 5% 이상이면 문제)
$ numastat
                           node0           node1
numa_hit               142857391       98234567   # 로컬 할당 성공 횟수
numa_miss                1234567        2345678   # 원격 폴백 횟수 (낮을수록 좋음)
numa_foreign             2345678        1234567   # 이 노드가 다른 노드의 miss를 수용
local_node             139400824       95888889
other_node               4690134        4690356   # 원격 할당 횟수
# ③ 특정 프로세스의 노드별 메모리 분포 확인
$ numastat -p $(pgrep -x mysqld)
Per-node process memory usage (MB):
         Node 0         Node 1          Total
Heap       512.00       256.00        768.00   # 이상적으로는 한 노드에 집중
Total      850.48       320.23       1170.71   # 분산이 크면 --membind 사용 고려
# ④ NUMA Balancing 상태 확인
$ cat /proc/sys/kernel/numa_balancing
1   # 1=자동 밸런싱 활성화 (대부분의 경우 권장)
    # 지연 민감 워크로드는 0으로 비활성화 후 수동 배치
# ⑤ miss 비율 계산 (5% 이상이면 NUMA 최적화 필요)
$ numastat | awk '/numa_hit/{hit=$2+$3} /numa_miss/{miss=$2+$3}
  END{printf &quot;Miss 비율: %.1f%%\n&quot;, miss*100/(hit+miss)}'
Miss 비율: 1.7%   # 5% 미만이면 양호한 상태
# ⑥ CPU가 어느 NUMA 노드에 속하는지 확인
$ cat /sys/devices/system/node/node0/cpulist
0-7   # Node 0에 CPU 0-7이 속함
$ cat /sys/devices/system/cpu/cpu3/topology/physical_package_id
0     # CPU 3은 소켓(패키지) 0 = Node 0&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;NUMA Ratio&amp;nbsp;해석&lt;/span&gt;:&lt;/b&gt;&amp;nbsp;&lt;b&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;node distances&lt;/span&gt;&lt;/b&gt;의&amp;nbsp;원격&amp;nbsp;거리를&amp;nbsp;10으로&amp;nbsp;나누면&amp;nbsp;NUMA Ratio가&amp;nbsp;나옵니다.&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;bull;&amp;nbsp;&amp;nbsp;거리&amp;nbsp;11~15 (Ratio 1.1~1.5):&amp;nbsp;영향이&amp;nbsp;적음.&amp;nbsp;자동&amp;nbsp;밸런싱으로&amp;nbsp;충분&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;bull;&amp;nbsp;&amp;nbsp;거리&amp;nbsp;21 (Ratio 2.1):&amp;nbsp;원격이&amp;nbsp;로컬보다&amp;nbsp;약&amp;nbsp;2배&amp;nbsp;느림. NUMA-aware&amp;nbsp;배치&amp;nbsp;강력&amp;nbsp;권장&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;bull;&amp;nbsp;&amp;nbsp;거리&amp;nbsp;31&amp;nbsp;이상&amp;nbsp;(Ratio 3.1+):&amp;nbsp;2홉&amp;nbsp;이상&amp;nbsp;원격.&amp;nbsp;성능&amp;nbsp;차이&amp;nbsp;매우&amp;nbsp;큼.&amp;nbsp;반드시&amp;nbsp;노드&amp;nbsp;격리&amp;nbsp;필요&lt;/span&gt;&lt;/blockquote&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;border-left: #0B2161 10px solid; padding-right: 10px; border-bottom: #0B2161 2px solid; pading-bottom: px; padding-top: 0px; margin: 10px 0px 5px; line-height: 30px;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;b&gt;3. &amp;nbsp;NUMA 하드웨어 토폴로지&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;NUMA(Non-Uniform Memory Access)&amp;nbsp;시스템에서&amp;nbsp;각&amp;nbsp;CPU&amp;nbsp;소켓은&amp;nbsp;자신에게&amp;nbsp;직접&amp;nbsp;연결된&amp;nbsp;&lt;b&gt;로컬&lt;/b&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;b&gt;메모리&lt;/b&gt;를가지며, 다른 소켓의 메모리에 접근할 때는 인터커넥트(QPI, UPI, Infinity Fabric 등)를 경유합니다. 이로 인해메모리 접근 지연 시간(latency)과 대역폭(bandwidth)이 위치에 따라 달라집니다. &amp;nbsp; # 컴퓨터 메모리&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-07-23 오후 2.33.25.png&quot; data-origin-width=&quot;1202&quot; data-origin-height=&quot;606&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dNXQx7/dJMcadvXTqP/ev1rQCpUk6KHFye55KpXS0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dNXQx7/dJMcadvXTqP/ev1rQCpUk6KHFye55KpXS0/img.png&quot; data-alt=&quot;2- 소켓 &amp;amp;nbsp;NUMA&amp;amp;nbsp; 토폴로지 &amp;amp;nbsp;&amp;amp;mdash;&amp;amp;nbsp; 로컬 / 리모트 &amp;amp;nbsp; 메모리 &amp;amp;nbsp; 접근 &amp;amp;nbsp; 지연 &amp;amp;nbsp; 시간 &amp;amp;nbsp; 차이&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dNXQx7/dJMcadvXTqP/ev1rQCpUk6KHFye55KpXS0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdNXQx7%2FdJMcadvXTqP%2Fev1rQCpUk6KHFye55KpXS0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1202&quot; height=&quot;606&quot; data-filename=&quot;스크린샷 2026-07-23 오후 2.33.25.png&quot; data-origin-width=&quot;1202&quot; data-origin-height=&quot;606&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;2- 소켓 &amp;nbsp;NUMA&amp;nbsp; 토폴로지 &amp;nbsp;&amp;mdash;&amp;nbsp; 로컬 / 리모트 &amp;nbsp; 메모리 &amp;nbsp; 접근 &amp;nbsp; 지연 &amp;nbsp; 시간 &amp;nbsp; 차이&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;4소켓 이상의 대규모 서버에서는 인터커넥트가 멀티홉(Multi-hop)으로 구성되어 NUMA 거리 편차가 더커집니다. 직접 연결된 노드(1홉)과 중간 노드를 경유하는 노드(2홉)의 지연 시간 차이가 크므로, 애플리케이션 배치 전략이 2소켓보다 훨씬 중요합니다. &amp;nbsp; # 데이터 관리&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-07-23 오후 2.34.06.png&quot; data-origin-width=&quot;1202&quot; data-origin-height=&quot;878&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cjyl05/dJMcaglZ2k9/jYljBtcDk0JnsZomztsytk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cjyl05/dJMcaglZ2k9/jYljBtcDk0JnsZomztsytk/img.png&quot; data-alt=&quot;4- 소켓 &amp;amp;nbsp;NUMA&amp;amp;nbsp; 토폴로지 &amp;amp;nbsp;&amp;amp;mdash;&amp;amp;nbsp; 직접 &amp;amp;nbsp; 연결 (1 홉 ,&amp;amp;nbsp; 거리 &amp;amp;nbsp;21) 과 &amp;amp;nbsp; 중간 &amp;amp;nbsp; 경유 (2 홉 ,&amp;amp;nbsp; 거리 &amp;amp;nbsp;31) 의 &amp;amp;nbsp; 비대칭 &amp;amp;nbsp; 거리&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cjyl05/dJMcaglZ2k9/jYljBtcDk0JnsZomztsytk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcjyl05%2FdJMcaglZ2k9%2FjYljBtcDk0JnsZomztsytk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1202&quot; height=&quot;878&quot; data-filename=&quot;스크린샷 2026-07-23 오후 2.34.06.png&quot; data-origin-width=&quot;1202&quot; data-origin-height=&quot;878&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;4- 소켓 &amp;nbsp;NUMA&amp;nbsp; 토폴로지 &amp;nbsp;&amp;mdash;&amp;nbsp; 직접 &amp;nbsp; 연결 (1 홉 ,&amp;nbsp; 거리 &amp;nbsp;21) 과 &amp;nbsp; 중간 &amp;nbsp; 경유 (2 홉 ,&amp;nbsp; 거리 &amp;nbsp;31) 의 &amp;nbsp; 비대칭 &amp;nbsp; 거리&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;# 분산 및 클라우드 컴퓨팅&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; 3.1&amp;nbsp; &lt;b&gt;NUMA Ratio&lt;/b&gt;&lt;b&gt;와&lt;/b&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;b&gt;영향&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;letter-spacing: 0px; color: #000000; border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; width=&quot;763&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style13&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;시스템 유형&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;인터커넥트&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;로컬 지연&amp;nbsp;(일반적 범위)&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;리모트 지연&amp;nbsp;(일반적 범위)&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;NUMA Ratio&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Intel 2S (Xeon Scalable)&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;UPI 2.0/3.0&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;~80ns&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;~130-150ns&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;1.6-1.9x&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Intel 4S/8S&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;UPI (멀티홉)&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;~80ns&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;~170-300ns&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;2.1-3.7x&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;AMD EPYC (2S)&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Infinity Fabric&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;~90ns&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;~140-160ns&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;1.5-1.8x&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;AMD EPYC (NPS4)&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;IF (소켓 내)&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;~85ns&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;~110-130ns&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;1.3-1.5x&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;ARM64&amp;nbsp;서버&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;CCIX/CXL&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;~100ns&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;~200-350ns&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;2.0-3.5x&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;CXL&amp;nbsp;메모리 확장&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;CXL 2.0&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;~80ns&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;~170-250ns&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;2.1-3.1x&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1784784928916&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# NUMA 토폴로지와 거리 매트릭스 확인
$ numactl --hardware | grep -A10 &quot;node distances&quot;
node distances:
node   0   1
  0:  10  21
  1:  21  10
# NUMA Ratio 계산: 원격 거리 / 로컬 거리 = 21 / 10 = 2.1
# 2.0 이상이면 NUMA 최적화 필수, 1.5 이하면 영향 적음
# 커널의 NUMA 거리 정보 (sysfs)
$ cat /sys/devices/system/node/node0/distance
10 21
# 커널 부팅 시 NUMA 탐색 로그
$ dmesg | grep -i numa
[    0.000000] SRAT: Node 0 PXM 0 [mem 0x00000000-0x7fffffff]
[    0.000000] SRAT: Node 1 PXM 1 [mem 0x80000000-0xffffffff]
[    0.000000] NUMA: Node 0 [mem 0x00000000-0x7fffffff] + ...
[    0.000000] NUMA: Initmem setup node 0 [mem 0x00000000-...]&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;AMD NPS (Nodes Per Socket)&lt;/span&gt;:&lt;/b&gt;&amp;nbsp;AMD EPYC&amp;nbsp;프로세서는&amp;nbsp;NPS&amp;nbsp;설정으로&amp;nbsp;단일&amp;nbsp;소켓&amp;nbsp;내부를&amp;nbsp;여러&amp;nbsp;NUMA&amp;nbsp;노드로&amp;nbsp;분할합니다. NPS1(1노드), NPS2(2노드), NPS4(4노드)&amp;nbsp;모드를&amp;nbsp;지원합니다. NPS4에서는&amp;nbsp;소켓&amp;nbsp;당4개의&amp;nbsp;CCD&amp;nbsp;그룹이&amp;nbsp;각각&amp;nbsp;독립&amp;nbsp;NUMA&amp;nbsp;노드가&amp;nbsp;되어,&amp;nbsp;로컬&amp;nbsp;메모리&amp;nbsp;접근&amp;nbsp;범위는&amp;nbsp;줄지만&amp;nbsp;지연&amp;nbsp;시간&amp;nbsp;편차가감소합니다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;# 칩 및 프로세서&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; 3.2 &amp;nbsp;&lt;b&gt;AMD EPYC NPS(Nodes Per Socket)&amp;nbsp;&lt;/b&gt;&lt;b&gt;토폴로지&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;AMD EPYC&amp;nbsp;&lt;a style=&quot;color: #333333;&quot; href=&quot;https://www.minzkn.com/linuxkernel/pages/numa.html&quot;&gt;&amp;nbsp;프로세서&lt;/a&gt;(Processor)는&amp;nbsp;CCD(Core Complex Die)&amp;nbsp;칩렛&amp;nbsp;아키텍처를&amp;nbsp;사용합니다. BIOS에서&amp;nbsp;NPS&amp;nbsp;설정을&amp;nbsp;변경하면&amp;nbsp;단일&amp;nbsp;소켓&amp;nbsp;내부의&amp;nbsp;NUMA&amp;nbsp;노드&amp;nbsp;수를&amp;nbsp;조절할&amp;nbsp;수&amp;nbsp;있습니다. NPS&amp;nbsp;값이&amp;nbsp;높을수록&amp;nbsp;로컬&amp;nbsp;메모리범위는&amp;nbsp;줄어들지만&amp;nbsp;접근&amp;nbsp;지연&amp;nbsp;편차가&amp;nbsp;감소합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-07-23 오후 2.36.34.png&quot; data-origin-width=&quot;1202&quot; data-origin-height=&quot;396&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cnwiql/dJMcagff1QD/Li6YbKm0YUJIKDFgNNP9lK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cnwiql/dJMcagff1QD/Li6YbKm0YUJIKDFgNNP9lK/img.png&quot; data-alt=&quot;AMD EPYC NPS&amp;amp;nbsp; 모드 &amp;amp;nbsp;&amp;amp;mdash; NPS1( 전체 &amp;amp;nbsp; 통합 ), NPS2(2 분할 ), NPS4(CCD 별 &amp;amp;nbsp; 독립 &amp;amp;nbsp; 노드 ) 의 &amp;amp;nbsp; 메모리 -CPU&amp;amp;nbsp; 매핑 (Mapping)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cnwiql/dJMcagff1QD/Li6YbKm0YUJIKDFgNNP9lK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcnwiql%2FdJMcagff1QD%2FLi6YbKm0YUJIKDFgNNP9lK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1202&quot; height=&quot;396&quot; data-filename=&quot;스크린샷 2026-07-23 오후 2.36.34.png&quot; data-origin-width=&quot;1202&quot; data-origin-height=&quot;396&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;AMD EPYC NPS&amp;nbsp; 모드 &amp;nbsp;&amp;mdash; NPS1( 전체 &amp;nbsp; 통합 ), NPS2(2 분할 ), NPS4(CCD 별 &amp;nbsp; 독립 &amp;nbsp; 노드 ) 의 &amp;nbsp; 메모리 -CPU&amp;nbsp; 매핑 (Mapping)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;color: #000000; text-align: start; border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; width=&quot;763&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style13&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;NPS&amp;nbsp;&lt;/b&gt;&lt;b&gt;모드&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;소켓당 노드 수&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;노드당 메모리 채널&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;특징&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;적합한 워크로드&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;NPS1&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;1&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;전체&amp;nbsp;(8&amp;nbsp;또는12)&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;최대 대역폭,&amp;nbsp;높은 지연 편차&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;단일 대형 프로세스&amp;nbsp;(JVM,&amp;nbsp;단일DB&amp;nbsp;인스턴스)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;NPS2&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;2&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;절반&amp;nbsp;(4&amp;nbsp;또는6)&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;대역폭/지역성 균형&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;범용 서버,&amp;nbsp;가상화(Virtualization)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;NPS4&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;4&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;1/4 (2&amp;nbsp;또는3)&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;최소 지연 편차,&amp;nbsp;좁은 로컬 범위&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;HPC,&amp;nbsp;지연 민감 워크로드&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; 3.3 &amp;nbsp;&lt;b&gt;Intel SNC(Sub-NUMA Clustering)&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Intel Xeon Scalable 프로세서도 SNC(Sub-NUMA Clustering) 기능으로 소켓 내부를 여러 NUMA 노드로분할합니다. SNC2는 소켓을 2개, SNC4(4세대 이상)는 4개의 NUMA 노드로 분할합니다. AMD NPS와 개념은유사하지만, Intel은 LLC(Last Level Cache) 슬라이스를 기준으로 분할합니다. &amp;nbsp; &amp;nbsp;# 컴퓨터 하드웨어&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-07-23 오후 2.38.03.png&quot; data-origin-width=&quot;1202&quot; data-origin-height=&quot;422&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kxbFv/dJMcacD0GNP/uiOPTnsVRUdaUCJwOykY90/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kxbFv/dJMcacD0GNP/uiOPTnsVRUdaUCJwOykY90/img.png&quot; data-alt=&quot;Intel SNC2 &amp;amp;mdash;&amp;amp;nbsp; 단일 &amp;amp;nbsp; 소켓 &amp;amp;nbsp; 내 &amp;amp;nbsp; 코어 /LLC/ 메모리 &amp;amp;nbsp; 컨트롤러를 &amp;amp;nbsp;2 개 &amp;amp;nbsp;NUMA&amp;amp;nbsp; 도메인으로 &amp;amp;nbsp; 분할&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kxbFv/dJMcacD0GNP/uiOPTnsVRUdaUCJwOykY90/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkxbFv%2FdJMcacD0GNP%2FuiOPTnsVRUdaUCJwOykY90%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1202&quot; height=&quot;422&quot; data-filename=&quot;스크린샷 2026-07-23 오후 2.38.03.png&quot; data-origin-width=&quot;1202&quot; data-origin-height=&quot;422&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Intel SNC2 &amp;mdash;&amp;nbsp; 단일 &amp;nbsp; 소켓 &amp;nbsp; 내 &amp;nbsp; 코어 /LLC/ 메모리 &amp;nbsp; 컨트롤러를 &amp;nbsp;2 개 &amp;nbsp;NUMA&amp;nbsp; 도메인으로 &amp;nbsp; 분할&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;NPS/SNC&amp;nbsp;변경&amp;nbsp;주의&lt;/span&gt;:&lt;/b&gt;&amp;nbsp;NPS나&amp;nbsp;SNC&amp;nbsp;설정을&amp;nbsp;변경하면&amp;nbsp;시스템의&amp;nbsp;NUMA&amp;nbsp;토폴로지가&amp;nbsp;바뀌므로,&amp;nbsp;numactl&amp;nbsp;바인딩스크립트, cgroup&amp;nbsp;cpuset.mems&amp;nbsp;설정, IRQ&amp;nbsp;친화성(Affinity)&amp;nbsp;규칙을&amp;nbsp;모두&amp;nbsp;재검토해야&amp;nbsp;합니다.&amp;nbsp;변경&amp;nbsp;전후에&amp;nbsp;numactl --hardware로&amp;nbsp;토폴로지를&amp;nbsp;확인하세요.&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;CPU&amp;nbsp;토폴로지&lt;/span&gt;:&lt;/b&gt;&amp;nbsp;AMD CCX/CCD/IOD&amp;nbsp;칩렛&amp;nbsp;구조, Intel Tile/Hybrid&amp;nbsp;아키텍처, ARM DynamIQ, Infinity Fabric,&amp;nbsp;스케줄링&amp;nbsp;도메인(Scheduling Domain)&amp;nbsp;계층에&amp;nbsp;대한&amp;nbsp;종합적인&amp;nbsp;내용은&amp;nbsp;&lt;a style=&quot;color: #333333;&quot; href=&quot;https://www.minzkn.com/linuxkernel/pages/cpu-topology.html&quot;&gt;CPU&amp;nbsp;토폴로지&lt;/a&gt;&amp;nbsp;페이지를&amp;nbsp;참조하세요.&lt;/span&gt;&lt;/blockquote&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp; # 컴퓨터 메모리&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;border-left: #0B2161 10px solid; padding-right: 10px; border-bottom: #0B2161 2px solid; pading-bottom: px; padding-top: 0px; margin: 10px 0px 5px; line-height: 30px;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;b&gt;4. &amp;nbsp;ACPI를 통한 NUMA 토폴로지 검색&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;커널은&amp;nbsp;부팅&amp;nbsp;시&amp;nbsp;ACPI&amp;nbsp;테이블을&amp;nbsp;파싱하여&amp;nbsp;NUMA&amp;nbsp;토폴로지를&amp;nbsp;구성합니다.&amp;nbsp;핵심&amp;nbsp;테이블은&amp;nbsp;SRAT(Static Resource Affinity Table)와&amp;nbsp;SLIT(System Locality Information Table)입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; 4.1&amp;nbsp; &lt;b&gt;SRAT (Static Resource Affinity Table)&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1784785195883&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/*
 * SRAT는 CPU와 메모리가 어떤 NUMA 노드에 속하는지 정의합니다.
 *
 * SRAT 하위 구조:
 * - Processor Local APIC Affinity: CPU(APIC ID) &amp;rarr; Node 매핑
 * - Memory Affinity: 메모리 범위 &amp;rarr; Node 매핑
 * - Processor Local x2APIC Affinity: x2APIC CPU &amp;rarr; Node 매핑
 * - GICC Affinity: ARM64 CPU &amp;rarr; Node 매핑
 * - Generic Initiator Affinity: CXL 장치 등 &amp;rarr; Node 매핑
 */
/* arch/x86/kernel/acpi/srat.c */
static int __init
acpi_parse_processor_affinity(union acpi_subtable_headers *header,
                              const unsigned long end)
{
    struct acpi_srat_cpu_affinity *p =
        (struct acpi_srat_cpu_affinity *)header;
    int pxm = p-&amp;gt;proximity_domain_lo |
              (p-&amp;gt;proximity_domain_hi[0] &amp;lt;&amp;lt; 8) |
              (p-&amp;gt;proximity_domain_hi[1] &amp;lt;&amp;lt; 16) |
              (p-&amp;gt;proximity_domain_hi[2] &amp;lt;&amp;lt; 24);
    /* proximity domain &amp;rarr; NUMA node 매핑 등록 */
    set_apicid_to_node(p-&amp;gt;apic_id, pxm_to_node(pxm));
    return 0;
}
static int __init
acpi_parse_memory_affinity(union acpi_subtable_headers *header,
                           const unsigned long end)
{
    struct acpi_srat_mem_affinity *ma =
        (struct acpi_srat_mem_affinity *)header;
    u64 start = ma-&amp;gt;base_address;
    u64 length = ma-&amp;gt;length;
    int node = pxm_to_node(ma-&amp;gt;proximity_domain);
    /* 메모리 범위를 노드에 등록 */
    numa_add_memblk(node, start, start + length);
    return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;12&quot; data-path-to-node=&quot;0&quot;&gt;리눅스 커널의 ACPI SRAT(System Resource Affinity Table) 파싱 루틴&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;일부입니다.&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-path-to-node=&quot;1&quot; data-ke-size=&quot;size16&quot;&gt;ACPI 표 중 하나인&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b data-index-in-node=&quot;13&quot; data-path-to-node=&quot;1&quot;&gt;SRAT&lt;/b&gt;는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b data-index-in-node=&quot;19&quot; data-path-to-node=&quot;1&quot;&gt;NUMA(Non-Uniform Memory Access) 아키텍처&lt;/b&gt;에서 물리적 리소스(CPU Core, 메모리 주소 영역, CXL 장치 등)가&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b data-index-in-node=&quot;98&quot; data-path-to-node=&quot;1&quot;&gt;어느 NUMA 노드(Proximity Domain)에 속해 있는지&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;리눅스 커널에 알려주는 핵심 역할을 합니다.&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-path-to-node=&quot;2&quot; data-ke-size=&quot;size16&quot;&gt;각 함수가 리눅스 부팅 과정에서 어떻게 작동하는지 핵심을 간단히 짚어가시죠.&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-path-to-node=&quot;4&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp; (1)&lt;span&gt;&amp;nbsp;&lt;/span&gt;acpi_parse_processor_affinity&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-path-to-node=&quot;5&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;5,0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,0&quot;&gt;&amp;nbsp; &amp;nbsp; CPU(APIC ID)를 NUMA 노드에 매핑&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000; text-align: start;&quot; data-path-to-node=&quot;6&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6,0,0&quot;&gt;동작 방식:&lt;/b&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;6,0,1&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;전달받은 SRAT 서브테이블 헤더를&lt;span&gt;&amp;nbsp;&lt;/span&gt;acpi_srat_cpu_affinity&lt;span&gt;&amp;nbsp;&lt;/span&gt;구조체로 형변환합니다.&lt;/li&gt;
&lt;li&gt;하위 8비트(proximity_domain_lo)와 상위 24비트(proximity_domain_hi)를 비트 시프트 연산으로 합쳐&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b data-index-in-node=&quot;74&quot; data-path-to-node=&quot;6,0,1,1,0&quot;&gt;32비트 Proximity Domain(PXM)&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;ID를 복원합니다.&lt;/li&gt;
&lt;li&gt;pxm_to_node(pxm)를 통해 ACPI의 PXM ID를 리눅스 커널의 internal&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b data-index-in-node=&quot;52&quot; data-path-to-node=&quot;6,0,1,2,0&quot;&gt;NUMA Node ID&lt;/b&gt;로 변환합니다.&lt;/li&gt;
&lt;li&gt;set_apicid_to_node(...)를 호출하여&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b data-index-in-node=&quot;30&quot; data-path-to-node=&quot;6,0,1,3,0&quot;&gt;특정 CPU의 APIC ID가 어떤 NUMA 노드에 속하는지&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;커널 테이블에 등록합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-path-to-node=&quot;8&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp; (2)&lt;span&gt;&amp;nbsp;&lt;/span&gt;acpi_parse_memory_affinity&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-path-to-node=&quot;9&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;9,0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,0&quot;&gt;&amp;nbsp; &amp;nbsp; 물리 메모리 구간(Base Address ~ Length)을 NUMA 노드에 매핑&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000; text-align: start;&quot; data-path-to-node=&quot;10&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;10,0,0&quot;&gt;동작 방식:&lt;/b&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;10,0,1&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;헤더를&lt;span&gt;&amp;nbsp;&lt;/span&gt;acpi_srat_mem_affinity&lt;span&gt;&amp;nbsp;&lt;/span&gt;구조체로 형변환합니다.&lt;/li&gt;
&lt;li&gt;해당 메모리 영역의 시작 주소(base_address)와 크기(length)를 추출합니다.&lt;/li&gt;
&lt;li&gt;PXM을 NUMA Node ID로 변환합니다.&lt;/li&gt;
&lt;li&gt;numa_add_memblk(node, start, start + length)를 호출해&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b data-index-in-node=&quot;50&quot; data-path-to-node=&quot;10,0,1,3,0&quot;&gt;특정 주소 범위의 메모리가 어느 NUMA 노드 메모리 블록에 해당하는지&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;커널에 추가합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-path-to-node=&quot;12&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp; 요약 및 핵심 포인트&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000; text-align: start;&quot; data-path-to-node=&quot;13&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;13,0,0&quot;&gt;부팅 시점:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;이 함수들은 초기화 함수(__init)로, 커널이 스케줄러와 메모리 관리자(Zone/Buddy Allocator)를 구성하기 직전에 실행됩니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;13,1,0&quot;&gt;성능 임팩트:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;커널은 이 정보를 바탕으로 &quot;CPU가 자신과 가장 가까운(LOCAL) 메모리에 우선적으로 물리 메모리를 할당&quot;하도록 스케줄링 및 메모리 정책을 수립합니다. (NUMA Remote Access로 인한 병목 현상 방지)&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; 4.2 &amp;nbsp;&lt;b&gt;SLIT (System Locality Information Table)&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1784785375679&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/*
 * SLIT는 노드 간 상대적 거리를 N&amp;times;N 매트릭스로 정의합니다.
 * 거리 10 = 자기 자신 (로컬), 값이 클수록 먼 노드
 *
 * 예시: 4-노드 시스템 SLIT 매트릭스
 *       Node0  Node1  Node2  Node3
 * Node0:  10     21     31     41
 * Node1:  21     10     21     31
 * Node2:  31     21     10     21
 * Node3:  41     31     21     10
 */
/* drivers/acpi/numa/srat.c */
void __init acpi_numa_slit_init(struct acpi_table_slit *slit)
{
    int i, j;
    for (i = 0; i &amp;lt; slit-&amp;gt;locality_count; i++)
        for (j = 0; j &amp;lt; slit-&amp;gt;locality_count; j++)
            numa_set_distance(
                pxm_to_node(i),
                pxm_to_node(j),
                slit-&amp;gt;entry[i * slit-&amp;gt;locality_count + j]);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; 4.3 &amp;nbsp;&lt;b&gt;HMAT (Heterogeneous Memory Attribute Table)&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;HMAT는&amp;nbsp;ACPI 6.2에서&amp;nbsp;도입된&amp;nbsp;테이블로,&amp;nbsp;각&amp;nbsp;메모리&amp;nbsp;초기자(Initiator,&amp;nbsp;예:&amp;nbsp;&lt;a style=&quot;color: #333333;&quot; href=&quot;https://www.minzkn.com/linuxkernel/pages/numa.html&quot;&gt;&amp;nbsp;CPU&lt;/a&gt;)와 메모리 대상(Target, 예: DRAM, CXL) 간의 지연 시간(Latency)과 대역폭(Bandwidth)을 구체적인 수치로 제공합니다. SLIT가 상대적거리만 제공하는 반면, HMAT는 절대적인 성능 특성을 전달합니다. &amp;nbsp; &amp;nbsp; # 분산 및 클라우드 컴퓨팅&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1784785420553&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/*
 * HMAT 주요 구조:
 *
 * 1. Memory Proximity Domain Attributes
 *    - 각 노드의 메모리 특성 (읽기/쓰기 지연, 대역폭)
 *
 * 2. System Locality Latency and Bandwidth Information
 *    - 이니시에이터 &amp;rarr; 타겟 간 접근 성능 매트릭스
 *    - 유형: Access, Read, Write 각각 별도
 *
 * 3. Memory Side Cache Information
 *    - CXL 장치 등의 메모리 사이드 캐시 정보
 *
 * 커널 파싱: drivers/acpi/numa/hmat.c
 * &amp;rarr; hmat_parse_proximity_domain()
 * &amp;rarr; hmat_parse_locality()
 * &amp;rarr; hmat_parse_cache()
 */
/* drivers/acpi/numa/hmat.c &amp;mdash; HMAT 지연/대역폭 파싱 */
static int __init hmat_parse_locality(
    union acpi_subtable_headers *header,
    const unsigned long end)
{
    struct acpi_hmat_locality *loc =
        (struct acpi_hmat_locality *)header;
    /* data_type: 0=Access, 1=Read, 2=Write */
    /* min_transfer_size, 대상 노드 수, 이니시에이터 수 */
    for (initiator ...) {
        for (target ...) {
            u16 value = entries[initiator * targets + target];
            /* value는 나노초(latency) 또는 MB/s(bandwidth) */
            hmat_update_target_access(target, initiator,
                                     loc-&amp;gt;data_type, value);
        }
    }
    return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1784785464374&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# HMAT 정보 확인 (sysfs)
# 각 노드의 접근 성능 속성
$ ls /sys/devices/system/node/node0/access0/initiators/
read_bandwidth  read_latency  write_bandwidth  write_latency
# Node 0에서 자기 자신(DRAM) 접근
$ cat /sys/devices/system/node/node0/access0/initiators/read_latency
80    # 80ns
$ cat /sys/devices/system/node/node0/access0/initiators/read_bandwidth
51200 # 51.2 GB/s
# CXL 노드 (Node 2)의 접근 성능
$ cat /sys/devices/system/node/node2/access0/initiators/read_latency
170   # 170ns (CXL 경유)
$ cat /sys/devices/system/node/node2/access0/initiators/read_bandwidth
32000 # 32 GB/s
# dmesg에서 HMAT 파싱 결과 확인
$ dmesg | grep -i hmat
ACPI: HMAT: Memory Proximity Domain Attributes: PXM=0 Init=0
ACPI: HMAT: Locality: Flags=0 Type=Access Initiator Domains=2 Target Domains=3
ACPI: HMAT: Initiator=0 Target=0 Read Latency=80ns
ACPI: HMAT: Initiator=0 Target=2 Read Latency=170ns&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;HMAT와&amp;nbsp;메모리&amp;nbsp;티어링&lt;/span&gt;:&amp;nbsp;&lt;/b&gt;커널의&amp;nbsp;메모리&amp;nbsp;티어링&amp;nbsp;프레임워크(&lt;span style=&quot;color: #009a87;&quot;&gt;CONFIG_MEMORY_TIER&lt;/span&gt;)는&amp;nbsp;HMAT의&amp;nbsp;지연/대역폭정보를&amp;nbsp;기반으로&amp;nbsp;메모리&amp;nbsp;노드를&amp;nbsp;자동으로&amp;nbsp;티어(빠른/느린)로&amp;nbsp;분류합니다. HMAT가&amp;nbsp;없는시스템에서는&amp;nbsp;&lt;span style=&quot;color: #009a87;&quot;&gt;/sys/devices/system/node/nodeN/memtier&lt;/span&gt;를&amp;nbsp;수동으로&amp;nbsp;설정해야&amp;nbsp;합니다.&amp;nbsp;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;# 칩 및 프로세서&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; 4.3 &amp;nbsp;&lt;b&gt;토폴로지&lt;/b&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;b&gt;확인&lt;/b&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;b&gt;명령&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1784785548440&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# NUMA 노드 목록
$ ls /sys/devices/system/node/
node0  node1
# 노드별 CPU 매핑
$ cat /sys/devices/system/node/node0/cpulist
0-7,16-23
$ cat /sys/devices/system/node/node1/cpulist
8-15,24-31
# 노드 간 거리 매트릭스
$ numactl --hardware
available: 2 nodes (0-1)
node 0 cpus: 0 1 2 3 4 5 6 7 16 17 18 19 20 21 22 23
node 0 size: 65366 MB
node 0 free: 48230 MB
node 1 cpus: 8 9 10 11 12 13 14 15 24 25 26 27 28 29 30 31
node 1 size: 65536 MB
node 1 free: 51200 MB
node distances:
node   0   1
  0:  10  21
  1:  21  10
# SRAT 정보 (dmesg)
$ dmesg | grep -i srat
ACPI: SRAT: Node 0 PXM 0 [mem 0x00000000-0x0fffffff]
ACPI: SRAT: Node 0 PXM 0 [mem 0x100000000-0xfffffffff]
ACPI: SRAT: Node 1 PXM 1 [mem 0x1000000000-0x1fffffffff]
# lstopo (hwloc)로 시각적 토폴로지 확인
$ lstopo --of txt
Machine (128GB total)
  NUMANode L#0 (P#0 64GB)
    Package L#0
      L3 L#0 (30MB)
        L2 L#0 (256KB) + L1d L#0 (32KB) + L1i L#0 (32KB) + Core L#0
          PU L#0 (P#0)
          PU L#1 (P#16)
        ...
  NUMANode L#1 (P#1 64GB)
    ...&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div id=&quot;model-response-message-contentr_b161062628b95798&quot; style=&quot;color: #000000; text-align: start;&quot;&gt;
&lt;p data-path-to-node=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;앞서 보셨던&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b data-index-in-node=&quot;13&quot; data-path-to-node=&quot;0&quot;&gt;ACPI SRAT 테이블을 파싱한 후, 리눅스 커널이 실제로 구성한 NUMA 토폴로지의 현황&lt;/b&gt;을 보여주는 셸 실행 결과입니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;1&quot; data-ke-size=&quot;size16&quot;&gt;가장 중요한 포인트들을 정리해 드릴게요.&lt;/p&gt;
&lt;p data-path-to-node=&quot;3&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp; (1) CPU 번호 할당 규칙 (SMT / 하이퍼스레딩)&lt;/b&gt;&lt;/p&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwju9pCIi-iVAxUAAAAAHQAAAAAQoAE&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;node 0 cpus: 0-7, 16-23
node 1 cpus: 8-15, 24-31
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;5&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CPU ID가 연속적이지 않고 중간에 징검다리처럼 꺾이는 이유는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b data-index-in-node=&quot;36&quot; data-path-to-node=&quot;5,0,0&quot;&gt;SMT(Hyper-Threading)&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;때문입니다.&lt;/li&gt;
&lt;li&gt;Node 0의 물리 코어에는 CPU&lt;span&gt;&amp;nbsp;&lt;/span&gt;0~7이 할당되고, 해당 코어들의 논리 스레드(Sibling Thread)에는 CPU&lt;span&gt;&amp;nbsp;&lt;/span&gt;16~23이 매핑되어 있습니다.&lt;/li&gt;
&lt;li&gt;lstopo&lt;span&gt;&amp;nbsp;&lt;/span&gt;명령어 결과를 보면&lt;span&gt;&amp;nbsp;&lt;/span&gt;Core L#0&lt;span&gt;&amp;nbsp;&lt;/span&gt;아래에&lt;span&gt;&amp;nbsp;&lt;/span&gt;PU L#0 (P#0)과&lt;span&gt;&amp;nbsp;&lt;/span&gt;PU L#1 (P#16)이 한 쌍으로 들어가 있는 것을 볼 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-path-to-node=&quot;7&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp; (2) SLIT (System Locality Information Table) 거리 매트릭스&lt;/b&gt;&lt;/p&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwju9pCIi-iVAxUAAAAAHQAAAAAQoQE&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;&lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;pre class=&quot;yaml&quot;&gt;&lt;code&gt;node distances:
node   0   1
  0:  10  21
  1:  21  10
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;9&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,0,0&quot;&gt;10&lt;span&gt;&amp;nbsp;&lt;/span&gt;(Local Access):&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;기준값 10은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b data-index-in-node=&quot;27&quot; data-path-to-node=&quot;9,0,0&quot;&gt;자신 노드의 메모리&lt;/b&gt;에 접근할 때의 레이턴시(가장 빠른 상태)입니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,1,0&quot;&gt;21&lt;span&gt;&amp;nbsp;&lt;/span&gt;(Remote Access):&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;CPU가 Interconnect(Intel UPI 또는 AMD Infinity Fabric)를 넘어&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b data-index-in-node=&quot;76&quot; data-path-to-node=&quot;9,1,0&quot;&gt;타 노드 메모리&lt;/b&gt;에 접근할 때는 약&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b data-index-in-node=&quot;95&quot; data-path-to-node=&quot;9,1,0&quot;&gt;2.1배의 레이턴시 손실&lt;/b&gt;이 발생함을 나타냅니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-path-to-node=&quot;11&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp; (3) SRAT 파싱 결과 (dmesg)&lt;/b&gt;&lt;/p&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwju9pCIi-iVAxUAAAAAHQAAAAAQogE&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;pre class=&quot;yaml&quot;&gt;&lt;code&gt;ACPI: SRAT: Node 0 PXM 0 [mem 0x00000000-0x0fffffff]
ACPI: SRAT: Node 0 PXM 0 [mem 0x100000000-0xfffffffff]
ACPI: SRAT: Node 1 PXM 1 [mem 0x1000000000-0x1fffffffff]
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;13&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이전에 본&lt;span&gt;&amp;nbsp;&lt;/span&gt;acpi_parse_memory_affinity()&lt;span&gt;&amp;nbsp;&lt;/span&gt;함수가 정상 실행되어 ACPI Proximity Domain(PXM) 0과 1의 물리 주소 범위가 노드 0과 1에 정확히 추가되었음을 보여줍니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;13,1,0&quot;&gt;Node 0 주소 불연속:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Node 0의 메모리가 중간에 비어 보이는 이유는 4GB 미만 구간(0x00000000~0x0fffffff)에 레거시 PCI/MMIO 장치 전용 예약 공간(PCI Hole)이 존재하여 메모리 mapping이 둘로 쪼개졌기 때문입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-path-to-node=&quot;15&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;15&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp; 실무 팁 (성능 최적화)&lt;/b&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;16&quot; data-ke-size=&quot;size16&quot;&gt;이러한 NUMA 구조를 파악했다면, 데이터베이스나 고성능 애플리케이션 실행 시 다음과 같이 메모리와 CPU를 바인딩하여&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b data-index-in-node=&quot;67&quot; data-path-to-node=&quot;16&quot;&gt;Remote Access(거리 21)&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;발생을 차단할 수 있습니다.&lt;/p&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwju9pCIi-iVAxUAAAAAHQAAAAAQowE&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;# Node 0의 CPU와 메모리만 사용하여 프로세스 실행
$ numactl --cpunodebind=0 --membind=0 ./my_high_perf_app
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;border-left: #0B2161 10px solid; padding-right: 10px; border-bottom: #0B2161 2px solid; pading-bottom: px; padding-top: 0px; margin: 10px 0px 5px; line-height: 30px;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;b&gt;5. &amp;nbsp;커널 자료구조: pglist_data&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;각&amp;nbsp;NUMA&amp;nbsp;노드는&amp;nbsp;&lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;struct pglist_data&lt;/b&gt;&lt;/span&gt;&amp;nbsp;(별칭&amp;nbsp;&lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;pg_data_t&lt;/b&gt;&lt;/span&gt;)로&amp;nbsp;표현됩니다.&amp;nbsp;이&amp;nbsp;구조체는&amp;nbsp;노드의&amp;nbsp;메모리&amp;nbsp;존,&amp;nbsp;페이지프레임(Page Frame),&amp;nbsp;통계&amp;nbsp;정보를&amp;nbsp;모두&amp;nbsp;관리합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;# 컴퓨터 과학&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1784785699328&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/* include/linux/mmzone.h (주요 필드 발췌) */
typedef struct pglist_data {
    /* ---- 존 정보 ---- */
    struct zone node_zones[MAX_NR_ZONES];    /* 노드 내 존 배열 */
    struct zonelist node_zonelists[MAX_ZONELISTS]; /* 할당 폴백 순서 */
    int nr_zones;                             /* 활성 존 수 */
    /* ---- 페이지 프레임 ---- */
    struct page *node_mem_map;                 /* 노드의 struct page 배열 */
    unsigned long node_start_pfn;              /* 시작 페이지 프레임 번호 */
    unsigned long node_present_pages;           /* 실제 존재하는 페이지 수 */
    unsigned long node_spanned_pages;           /* 시작~끝 범위 (hole 포함) */
    int node_id;                               /* 이 노드의 번호 */
    /* ---- 페이지 회수 (reclaim) ---- */
    wait_queue_head_t kswapd_wait;             /* kswapd 대기 큐 */
    wait_queue_head_t pfmemalloc_wait;
    struct task_struct *kswapd;                /* 이 노드의 kswapd 스레드 */
    int kswapd_order;
    enum zone_type kswapd_highest_zoneidx;
    /* ---- LRU 리스트 (페이지 에이징) ---- */
    struct lruvec __lruvec;                    /* 노드 단위 LRU 벡터 */
    /* ---- 통계 ---- */
    unsigned long totalreserve_pages;
    struct per_cpu_nodestat __percpu *per_cpu_nodestats;
    /* ---- Compaction ---- */
    unsigned long compact_cached_free_pfn;
    unsigned long compact_cached_migrate_pfn[ASYNC_AND_SYNC];
    /* ---- NUMA Balancing ---- */
    spinlock_t numabalancing_migrate_lock;
    unsigned long numabalancing_migrate_nr_pages;
    unsigned long numabalancing_migrate_next_window;
} pg_data_t;
/* 전역 노드 배열 */
extern struct pglist_data *node_data[];
#define NODE_DATA(nid)  (node_data[nid])&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-07-23 오후 2.50.29.png&quot; data-origin-width=&quot;1246&quot; data-origin-height=&quot;698&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lihhD/dJMcab56kGb/Lyf0wEqrygLqQv576dIeA1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lihhD/dJMcab56kGb/Lyf0wEqrygLqQv576dIeA1/img.png&quot; data-alt=&quot;pglist_data(Node 0) &amp;amp;mdash;&amp;amp;nbsp; 존 &amp;amp;nbsp; 배열 , zonelist&amp;amp;nbsp; 폴백 &amp;amp;nbsp; 순서 , zone&amp;amp;nbsp; 구조체의 &amp;amp;nbsp; 주요 &amp;amp;nbsp; 필드&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lihhD/dJMcab56kGb/Lyf0wEqrygLqQv576dIeA1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlihhD%2FdJMcab56kGb%2FLyf0wEqrygLqQv576dIeA1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;773&quot; height=&quot;433&quot; data-filename=&quot;스크린샷 2026-07-23 오후 2.50.29.png&quot; data-origin-width=&quot;1246&quot; data-origin-height=&quot;698&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;pglist_data(Node 0) &amp;mdash;&amp;nbsp; 존 &amp;nbsp; 배열 , zonelist&amp;nbsp; 폴백 &amp;nbsp; 순서 , zone&amp;nbsp; 구조체의 &amp;nbsp; 주요 &amp;nbsp; 필드&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;# &amp;nbsp;운영체제&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; 5.1 &amp;nbsp;&lt;b&gt;Zonelist &amp;mdash;&amp;nbsp;&lt;/b&gt;&lt;b&gt;할당&lt;/b&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;b&gt;폴백&lt;/b&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;b&gt;순서&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;i&gt;/* *&amp;nbsp;&lt;/i&gt;&lt;i&gt;메모리&lt;/i&gt;&lt;i&gt;&amp;nbsp;&lt;/i&gt;&lt;i&gt;할당&lt;/i&gt;&lt;i&gt;&amp;nbsp;&lt;/i&gt;&lt;i&gt;시&lt;/i&gt;&lt;i&gt;&amp;nbsp;&lt;/i&gt;&lt;i&gt;존리스트&lt;/i&gt;&lt;i&gt;(zonelist)&lt;/i&gt;&lt;i&gt;를&lt;/i&gt;&lt;i&gt;&amp;nbsp;&lt;/i&gt;&lt;i&gt;따라&lt;/i&gt;&lt;i&gt;&amp;nbsp;&lt;/i&gt;&lt;i&gt;폴백합니다&lt;/i&gt;&lt;i&gt;. * * Node 0&lt;/i&gt;&lt;i&gt;의&lt;/i&gt;&lt;i&gt;&amp;nbsp;zonelist[ZONELIST_FALLBACK]: *&amp;nbsp;&amp;nbsp;Node0:ZONE_NORMAL &amp;rarr; Node0:ZONE_DMA32 &amp;rarr; Node0:ZONE_DMA *&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;rarr; Node1:ZONE_NORMAL &amp;rarr; Node1:ZONE_DMA32 &amp;rarr; Node1:ZONE_DMA * *&amp;nbsp;&lt;/i&gt;&lt;i&gt;순서&lt;/i&gt;&lt;i&gt;:&amp;nbsp;&lt;/i&gt;&lt;i&gt;로컬&lt;/i&gt;&lt;i&gt;&amp;nbsp;&lt;/i&gt;&lt;i&gt;노드&lt;/i&gt;&lt;i&gt;&amp;nbsp;&lt;/i&gt;&lt;i&gt;우선&lt;/i&gt;&lt;i&gt;&amp;nbsp;&amp;rarr;&amp;nbsp;&lt;/i&gt;&lt;i&gt;거리가&lt;/i&gt;&lt;i&gt;&amp;nbsp;&lt;/i&gt;&lt;i&gt;가까운&lt;/i&gt;&lt;i&gt;&amp;nbsp;&lt;/i&gt;&lt;i&gt;노드&lt;/i&gt;&lt;i&gt;&amp;nbsp;&lt;/i&gt;&lt;i&gt;순&lt;/i&gt;&lt;i&gt;&amp;nbsp;* SLIT&amp;nbsp;&lt;/i&gt;&lt;i&gt;거리&lt;/i&gt;&lt;i&gt;&lt;/i&gt;&lt;i&gt;기반으로&lt;/i&gt;&lt;i&gt;&amp;nbsp;&lt;/i&gt;&lt;i&gt;정렬됨&lt;/i&gt;&lt;i&gt;&amp;nbsp;*/&lt;/i&gt;struct zonelist {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;struct zoneref _zonerefs[MAX_ZONES_PER_ZONELIST + 1];};struct zoneref {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;struct zone *zone;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;i&gt;/*&amp;nbsp;&lt;/i&gt;&lt;i&gt;존&lt;/i&gt;&lt;i&gt;&amp;nbsp;&lt;/i&gt;&lt;i&gt;포인터&lt;/i&gt;&lt;i&gt;&amp;nbsp;*/&lt;/i&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int zone_idx;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;i&gt;/*&amp;nbsp;&lt;/i&gt;&lt;i&gt;존&lt;/i&gt;&lt;i&gt;&amp;nbsp;&lt;/i&gt;&lt;i&gt;인덱스&lt;/i&gt;&lt;i&gt;&amp;nbsp;*/&lt;/i&gt;};&lt;i&gt;/* zonelist&amp;nbsp;&lt;/i&gt;&lt;i&gt;탐색&lt;/i&gt;&lt;i&gt;&amp;nbsp;&lt;/i&gt;&lt;i&gt;매크로&lt;/i&gt;&lt;i&gt;*/&lt;/i&gt;for_each_zone_zonelist(zone, z, zonelist, highest_zoneidx) {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;i&gt;/*&amp;nbsp;&lt;/i&gt;&lt;i&gt;로컬&lt;/i&gt;&lt;i&gt;&amp;nbsp;&lt;/i&gt;&lt;i&gt;노드부터&lt;/i&gt;&lt;i&gt;&amp;nbsp;&lt;/i&gt;&lt;i&gt;리모트&lt;/i&gt;&lt;i&gt;&amp;nbsp;&lt;/i&gt;&lt;i&gt;노드까지&lt;/i&gt;&lt;i&gt;&amp;nbsp;&lt;/i&gt;&lt;i&gt;순서대로&lt;/i&gt;&lt;i&gt;&amp;nbsp;&lt;/i&gt;&lt;i&gt;시도&lt;/i&gt;&lt;i&gt;*/&lt;/i&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;page = rmqueue(zone, order, gfp_mask);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (page)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return page;}&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; 5.2 &amp;nbsp;노드 통계 확인&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1784785941160&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 노드별 메모리 통계 (/sys/devices/system/node/node*/meminfo)
$ cat /sys/devices/system/node/node0/meminfo
Node 0 MemTotal:       65536000 kB
Node 0 MemFree:        48230000 kB
Node 0 MemUsed:        17306000 kB
Node 0 Active:         8120000 kB
Node 0 Inactive:       6450000 kB
Node 0 AnonPages:      5230000 kB
Node 0 FilePages:      9340000 kB
Node 0 Slab:           1530000 kB
Node 0 SReclaimable:   1200000 kB
...
# 노드별 존 정보
$ cat /proc/zoneinfo | grep -A3 &quot;Node 0&quot;
Node 0, zone   Normal
  pages free     12057500
        min      16384
        low      20480
# numastat &amp;mdash; 노드별 NUMA 적중/미스 통계
$ numastat
                           node0           node1
numa_hit               142857391       98234567
numa_miss                1234567        2345678
numa_foreign             2345678        1234567
interleave_hit           3456789        3456789
local_node             139400824       95888889
other_node               4690134        4690356&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;border-left: #0B2161 10px solid; padding-right: 10px; border-bottom: #0B2161 2px solid; pading-bottom: px; padding-top: 0px; margin: 10px 0px 5px; line-height: 30px;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;b&gt;6. NUMA 메모리 정책&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Linux&amp;nbsp;커널은&amp;nbsp;프로세스와&amp;nbsp;메모리&amp;nbsp;영역별로&amp;nbsp;NUMA&amp;nbsp;메모리&amp;nbsp;할당&amp;nbsp;정책을&amp;nbsp;지정할&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;이는&amp;nbsp;&lt;b&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;set_mempolicy()&lt;/span&gt;&lt;/b&gt;,&amp;nbsp;&lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;mbind()&lt;/b&gt;&lt;/span&gt;&amp;nbsp;시스템&amp;nbsp;콜(System Call)과&amp;nbsp;&lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;numactl&lt;/b&gt;&lt;/span&gt;&amp;nbsp;도구로&amp;nbsp;제어합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;# 소프트웨어&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;메모리&amp;nbsp;정책이란&amp;nbsp;(기초&amp;nbsp;개념)&lt;/span&gt;:&lt;/b&gt;&amp;nbsp;NUMA&amp;nbsp;시스템에서&amp;nbsp;&quot;어느&amp;nbsp;노드의&amp;nbsp;메모리에서&amp;nbsp;할당할지&quot;를&amp;nbsp;결정하는규칙입니다.&amp;nbsp;예를&amp;nbsp;들어&amp;nbsp;&lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;numactl --membind=0 ./app &lt;/b&gt;&lt;/span&gt;을&amp;nbsp;실행하면&amp;nbsp;app이&amp;nbsp;사용하는&amp;nbsp;메모리는&amp;nbsp;반드시&amp;nbsp;Node 0에서만할당됩니다.&amp;nbsp;정책을&amp;nbsp;지정하지&amp;nbsp;않으면&amp;nbsp;커널은&amp;nbsp;현재&amp;nbsp;CPU와&amp;nbsp;같은&amp;nbsp;노드(로컬)에서&amp;nbsp;우선&amp;nbsp;할당을&amp;nbsp;시도합니다.&amp;nbsp;네가지&amp;nbsp;핵심&amp;nbsp;정책:&lt;br /&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;bull;&amp;nbsp;&amp;nbsp;DEFAULT:&lt;/b&gt;&amp;nbsp;상위&amp;nbsp;정책(태스크&amp;nbsp;&amp;rarr;&amp;nbsp;시스템)으로&amp;nbsp;폴백.&amp;nbsp;&lt;b&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;mbind()&lt;/span&gt;&lt;/b&gt;로&amp;nbsp;지정한&amp;nbsp;VMA&amp;nbsp;정책&amp;nbsp;해제&amp;nbsp;시&amp;nbsp;사용&lt;br /&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;bull;&amp;nbsp;&amp;nbsp;BIND:&lt;/b&gt;&amp;nbsp;지정&amp;nbsp;노드에서만&amp;nbsp;강제&amp;nbsp;할당.&amp;nbsp;해당&amp;nbsp;노드&amp;nbsp;메모리&amp;nbsp;부족&amp;nbsp;시&amp;nbsp;OOM&amp;nbsp;발생.&amp;nbsp;완벽한&amp;nbsp;메모리&amp;nbsp;격리&amp;nbsp;목적&lt;br /&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;bull;&amp;nbsp;&amp;nbsp;PREFERRED:&lt;/b&gt;&amp;nbsp;선호&amp;nbsp;노드를&amp;nbsp;지정하되,&amp;nbsp;부족하면&amp;nbsp;다른&amp;nbsp;노드로&amp;nbsp;폴백.&amp;nbsp;소프트&amp;nbsp;바인딩&lt;br /&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;bull;&amp;nbsp;&amp;nbsp;INTERLEAVE:&lt;/b&gt;&amp;nbsp;지정&amp;nbsp;노드들에&amp;nbsp;라운드-로빈으로&amp;nbsp;분산&amp;nbsp;할당.&amp;nbsp;전체&amp;nbsp;대역폭&amp;nbsp;극대화(대형&amp;nbsp;해시&amp;nbsp;테이블&amp;nbsp;등)&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-07-23 오후 2.57.39.png&quot; data-origin-width=&quot;1556&quot; data-origin-height=&quot;612&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pr8Bc/dJMcabZojyc/sZfcL8XpKhpMQaklfehe21/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pr8Bc/dJMcabZojyc/sZfcL8XpKhpMQaklfehe21/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pr8Bc/dJMcabZojyc/sZfcL8XpKhpMQaklfehe21/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fpr8Bc%2FdJMcabZojyc%2FsZfcL8XpKhpMQaklfehe21%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1556&quot; height=&quot;612&quot; data-filename=&quot;스크린샷 2026-07-23 오후 2.57.39.png&quot; data-origin-width=&quot;1556&quot; data-origin-height=&quot;612&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; 6.1 &amp;nbsp;정책 유형&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;color: #000000; text-align: start; border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; width=&quot;763&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style13&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;정책&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;상수&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;동작&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;용도&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;Default&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;MPOL_DEFAULT&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;명시 정책을 제거하고 다음으로 구체적인 범위로 폴백&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;task/VMA&amp;nbsp;정책 해제, system default&amp;nbsp;복귀&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;Bind&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;MPOL_BIND&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;지정된 노드 집합에서만 할당&amp;nbsp;(실패 시&amp;nbsp;OOM)&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;메모리 격리(Isolation),전용 노드&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;Preferred&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;MPOL_PREFERRED&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;선호 노드에서 우선 할당,&amp;nbsp;실패 시 다른 노드 폴백&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;소프트 바인딩&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;Preferred Many&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;MPOL_PREFERRED_MANY&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;지정&amp;nbsp;nodemask&amp;nbsp;내에서 우선 만족시키고 부족하면 다른 노드 폴백&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;유연한 선호(v5.15+)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;Interleave&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;MPOL_INTERLEAVE&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;익명/공유 메모리는&amp;nbsp;page offset, page cache는&amp;nbsp;task&amp;nbsp;카운터 기준 분산&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;대역폭 극대화,&amp;nbsp;해시 테이블(Hash Table)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;Local&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;MPOL_LOCAL&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;폴백이 아니라 명시적으로local allocation을 선택&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;MPOL_DEFAULT와 구분되는 명시적 로컬 할당&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;Weighted Interleave&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;MPOL_WEIGHTED_INTERLEAVE&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;MPOL_INTERLEAVE와 같은 경로에서 가중치 비율만 다르게 적용&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;CXL&amp;nbsp;이종 메모리,&amp;nbsp;비대칭 대역폭 환경&amp;nbsp;(v6.9+)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; 6.2 &amp;nbsp;&lt;b&gt;정책&lt;/b&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;b&gt;범위와&lt;/b&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;b&gt;재바인딩&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;mempolicy는&amp;nbsp;단일&amp;nbsp;전역&amp;nbsp;설정이&amp;nbsp;아닙니다.&amp;nbsp;커널은&amp;nbsp;정책&amp;nbsp;범위(Policy Scope)를&amp;nbsp;system default, task policy, VMA policy, shared policy로&amp;nbsp;나누어&amp;nbsp;해석하며,&amp;nbsp;어떤&amp;nbsp;범위가&amp;nbsp;실제로&amp;nbsp;적용되는지는&amp;nbsp;매핑&amp;nbsp;유형과&amp;nbsp;cpuset&amp;nbsp;제약에&amp;nbsp;따라달라집니다.&amp;nbsp;특히&amp;nbsp;regular file의&amp;nbsp;MAP_SHARED&amp;nbsp;page cache는&amp;nbsp;VMA&amp;nbsp;정책을&amp;nbsp;직접&amp;nbsp;따르지&amp;nbsp;않는다는&amp;nbsp;점을명시적으로&amp;nbsp;이해해야&amp;nbsp;합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;# 컴퓨터 메모리&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-07-23 오후 2.59.19.png&quot; data-origin-width=&quot;1556&quot; data-origin-height=&quot;576&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cmeC4V/dJMcajiLVpP/AIKHs5sAS3FtPDUBs4AEKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cmeC4V/dJMcajiLVpP/AIKHs5sAS3FtPDUBs4AEKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cmeC4V/dJMcajiLVpP/AIKHs5sAS3FtPDUBs4AEKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcmeC4V%2FdJMcajiLVpP%2FAIKHs5sAS3FtPDUBs4AEKk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1556&quot; height=&quot;576&quot; data-filename=&quot;스크린샷 2026-07-23 오후 2.59.19.png&quot; data-origin-width=&quot;1556&quot; data-origin-height=&quot;576&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;color: #000000; text-align: start; border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; width=&quot;763&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style13&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;항목&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;핵심 의미&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;실전 주의점&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;MPOL_F_STATIC_NODES&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;cpuset&amp;nbsp;허용 노드가 바뀌어도 사용자nodemask를 상대 재해석하지 않습니다.&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;허용 노드와 교집합이 비면 정책이 사실상 무력화되고&amp;nbsp;default/local&amp;nbsp;폴백처럼 보일 수 있습니다.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;MPOL_F_RELATIVE_NODES&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;사용자&amp;nbsp;nodemask를 현재&amp;nbsp;cpuset에 대한 상대 위치로 해석합니다.&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;컨테이너(Container)나&amp;nbsp;cpuset이 자주 바뀌는 환경에서 더 예측 가능하지만,&amp;nbsp;실제 물리 노드 번호와&amp;nbsp;1:1&amp;nbsp;대응된다고 보면 안 됩니다.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;MPOL_F_NUMA_BALANCING&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;MPOL_BIND&lt;/b&gt;&lt;/span&gt;와 함께NUMA balancing을 허용하는 플래그입니다.&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;모든&amp;nbsp;mode에 붙는 범용 플래그가 아닙니다.&amp;nbsp;잘못 조합하면&amp;nbsp;&lt;b&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;EINVAL&lt;/span&gt;&lt;/b&gt;이 납니다.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;home node&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;기존&amp;nbsp;VMA&amp;nbsp;정책 범위에 대해 할당 시작점을 더 가까운 노드로 조정합니다.&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;set_mempolicy_home_node()는 새 정책 생성이 아니라 기존&amp;nbsp;VMA policy&amp;nbsp;범위의&amp;nbsp;home node만 갱신합니다.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; 6.3 &amp;nbsp;시스템 콜&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1784790988442&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;numaif.h&amp;gt;

/* 프로세스 전체 NUMA 정책 설정 */
long set_mempolicy(
    int mode,                /* MPOL_DEFAULT, MPOL_BIND, ... */
    const unsigned long *nodemask,  /* 대상 노드 비트마스크 */
    unsigned long maxnode   /* nodemask 비트 수 */
);

/* 특정 메모리 영역의 NUMA 정책 설정 */
long mbind(
    void *addr,              /* 시작 주소 (페이지 정렬) */
    unsigned long len,       /* 길이 */
    int mode,                /* MPOL_BIND, MPOL_INTERLEAVE, ... */
    const unsigned long *nodemask,
    unsigned long maxnode,
    unsigned int flags       /* MPOL_MF_MOVE, MPOL_MF_STRICT, ... */
);

/* 현재 task policy, 특정 주소의 policy, 또는 노드 위치 조회 */
long get_mempolicy(
    int *policy,
    unsigned long *nodemask,
    unsigned long maxnode,
    void *addr,
    unsigned long flags      /* MPOL_F_NODE, MPOL_F_ADDR */
);

/* 페이지를 다른 노드로 마이그레이션 */
long migrate_pages(
    pid_t pid,
    unsigned long maxnode,
    const unsigned long *old_nodes,  /* 원본 노드 */
    const unsigned long *new_nodes   /* 대상 노드 */
);

/* 개별 페이지 단위 마이그레이션 */
long move_pages(
    pid_t pid,
    unsigned long count,
    void **pages,             /* 페이지 주소 배열 */
    const int *nodes,        /* 대상 노드 배열 (NULL이면 조회) */
    int *status,              /* 결과/현재 노드 */
    int flags
);&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;API&amp;nbsp;&lt;/b&gt;&lt;b&gt;역할&lt;/b&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;b&gt;구분&lt;/b&gt;&lt;b&gt;:&lt;/b&gt;&amp;nbsp;set_mempolicy()는&amp;nbsp;task default policy를&amp;nbsp;바꾸고,&amp;nbsp;mbind()는&amp;nbsp;주소&amp;nbsp;범위의&amp;nbsp;VMA/shared policy를설정합니다.&amp;nbsp;get_mempolicy()는&amp;nbsp;현재&amp;nbsp;task policy를&amp;nbsp;복원&amp;nbsp;가능한&amp;nbsp;형태로&amp;nbsp;읽거나,&amp;nbsp;플래그&amp;nbsp;조합에&amp;nbsp;따라&amp;nbsp;특정&amp;nbsp;주소의policy&amp;nbsp;또는&amp;nbsp;현재&amp;nbsp;노드&amp;nbsp;위치를&amp;nbsp;조회하는&amp;nbsp;API입니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; # 분산 및 클라우드 컴퓨팅&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; 6.4 &amp;nbsp;&lt;b&gt;numactl&amp;nbsp;&lt;/b&gt;&lt;b&gt;사용&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1784791040874&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 특정 노드에서만 메모리 할당 (bind)
$ numactl --membind=0 ./my_application

# 특정 CPU에서 실행 + 해당 노드의 메모리 사용
$ numactl --cpunodebind=0 --membind=0 ./my_application

# 인터리브 모드 (모든 노드에 분산)
$ numactl --interleave=all ./hash_table_server

# 선호 노드 지정 (폴백 허용)
$ numactl --preferred=1 ./my_application

# 현재 실행 중인 프로세스의 NUMA 매핑 확인
$ numastat -p &amp;lt;pid&amp;gt;
Per-node process memory usage (in MBs) for PID &amp;lt;pid&amp;gt;
                          Node 0      Node 1       Total
                 --------- --------- -----------
Huge                  0.00      0.00        0.00
Heap                256.50     12.30      268.80
Stack                 0.12      0.00        0.12
Private            1024.00     48.00     1072.00
...

# 프로세스의 NUMA 메모리 맵 (/proc/PID/numa_maps)
$ cat /proc/self/numa_maps
00400000 default file=/usr/bin/cat mapped=10 N0=10
7f8a1000 default anon=3 dirty=3 N0=2 N1=1
7ffd2000 default stack anon=2 dirty=2 N0=2&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; 6.5 &amp;nbsp;&lt;b&gt;커널&lt;/b&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;b&gt;내부&lt;/b&gt;&lt;b&gt;&amp;nbsp;NUMA&amp;nbsp;&lt;/b&gt;&lt;b&gt;할당&lt;/b&gt;&lt;b&gt; API&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1784791073576&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/* NUMA-aware 커널 메모리 할당 */

/* 특정 노드에서 페이지 할당 */
struct page *alloc_pages_node(int nid, gfp_t gfp, unsigned int order);

/* 현재 CPU의 로컬 노드에서 할당 */
struct page *alloc_pages(gfp_t gfp, unsigned int order);

/* 특정 노드에서 slab 할당 */
void *kmalloc_node(size_t size, gfp_t flags, int node);
void *kzalloc_node(size_t size, gfp_t flags, int node);
void *kvmalloc_node(size_t size, gfp_t flags, int node);

/* kmem_cache에서 특정 노드 할당 */
void *kmem_cache_alloc_node(struct kmem_cache *s, gfp_t flags, int node);

/* GFP 플래그로 NUMA 제어 */
__GFP_THISNODE   /* 지정된 노드에서만 할당 (폴백 금지) */

/* 현재 CPU의 NUMA 노드 번호 */
int nid = numa_node_id();         /* 현재 CPU의 노드 */
int nid = cpu_to_node(cpu);       /* 특정 CPU의 노드 */
int nid = page_to_nid(page);      /* 페이지가 속한 노드 */

/* 디바이스의 NUMA 노드 (PCIe 장치 등) */
int nid = dev_to_node(dev);        /* 장치에 가장 가까운 노드 */

/* 예시: NIC의 로컬 노드에 sk_buff 할당 */
int nid = dev_to_node(&amp;amp;netdev-&amp;gt;dev);
skb = __alloc_skb(size, GFP_ATOMIC, 0, nid);&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;border-left: #0B2161 10px solid; padding-right: 10px; border-bottom: #0B2161 2px solid; pading-bottom: px; padding-top: 0px; margin: 10px 0px 5px; line-height: 30px;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;b&gt;7. &amp;nbsp;Automatic NUMA Balancing&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Automatic NUMA Balancing은 커널이 자동으로 프로세스의 메모리를 적절한 NUMA 노드로마이그레이션하는 메커니즘입니다. 사용자 공간(User Space)의 개입 없이 NUMA 지역성을 최적화합니다. &amp;nbsp; &amp;nbsp; # 운영체제&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;왜&lt;/b&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;b&gt;자동&lt;/b&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;b&gt;밸런싱이&lt;/b&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;b&gt;필요한가&lt;/b&gt;&lt;b&gt;:&lt;/b&gt;&amp;nbsp;NUMA&amp;nbsp;시스템에서&amp;nbsp;프로세스를&amp;nbsp;처음&amp;nbsp;시작하면&amp;nbsp;메모리가&amp;nbsp;최적이&amp;nbsp;아닌&amp;nbsp;노드에할당될&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;예를&amp;nbsp;들어&amp;nbsp;Node 0에서&amp;nbsp;시작된&amp;nbsp;프로세스의&amp;nbsp;스레드가&amp;nbsp;나중에&amp;nbsp;Node 1의&amp;nbsp;CPU에서&amp;nbsp;실행되면자신의&amp;nbsp;데이터에&amp;nbsp;원격&amp;nbsp;접근을&amp;nbsp;반복하게&amp;nbsp;됩니다. Automatic NUMA Balancing은&amp;nbsp;이&amp;nbsp;불일치를감지하여&amp;nbsp;&lt;b&gt;페이지를&lt;/b&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;b&gt;자주&lt;/b&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;b&gt;접근하는&lt;/b&gt;&lt;b&gt;&amp;nbsp;CPU&lt;/b&gt;&lt;b&gt;의&lt;/b&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;b&gt;노드로&lt;/b&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;b&gt;자동&lt;/b&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;b&gt;이동&lt;/b&gt;시킵니다.&amp;nbsp;단,&amp;nbsp;이&amp;nbsp;과정에서&amp;nbsp;짧은&amp;nbsp;성능&amp;nbsp;저하(NUMA&amp;nbsp;페이지&amp;nbsp;폴트(Page Fault))가&amp;nbsp;발생하므로,&amp;nbsp;지연&amp;nbsp;시간이&amp;nbsp;극도로&amp;nbsp;민감한&amp;nbsp;워크로드에서는&amp;nbsp;비활성화(echo 0 &amp;gt; /proc/sys/kernel/numa_balancing)&amp;nbsp;후&amp;nbsp;수동&amp;nbsp;배치(numactl)가&amp;nbsp;더&amp;nbsp;적합합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; 7.1&amp;nbsp; &lt;b&gt;동작&lt;/b&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;b&gt;원리&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Automatic NUMA Balancing은&amp;nbsp;4단계&amp;nbsp;파이프라인(Pipeline)으로&amp;nbsp;동작합니다.&amp;nbsp;스캔&amp;nbsp;&amp;rarr;&amp;nbsp;폴트&amp;nbsp;&amp;rarr;&amp;nbsp;판단&amp;nbsp;&amp;rarr;&amp;nbsp;마이그레이션&amp;nbsp;순서로,&amp;nbsp;커널이&amp;nbsp;자동으로&amp;nbsp;페이지와&amp;nbsp;태스크(Task)의&amp;nbsp;NUMA&amp;nbsp;배치를&amp;nbsp;최적화합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-07-23 오후 4.18.37.png&quot; data-origin-width=&quot;1510&quot; data-origin-height=&quot;868&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lO80x/dJMcahrLNeU/RtB0LUPHSvjatYHjm8qlD1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lO80x/dJMcahrLNeU/RtB0LUPHSvjatYHjm8qlD1/img.png&quot; data-alt=&quot;Automatic NUMA Balancing &amp;amp;mdash;&amp;amp;nbsp; 스캔 &amp;amp;nbsp;&amp;amp;rarr;&amp;amp;nbsp; 폴트 &amp;amp;nbsp;&amp;amp;rarr;&amp;amp;nbsp; 판단 &amp;amp;nbsp;&amp;amp;rarr;&amp;amp;nbsp; 마이그레이션 &amp;amp;nbsp;4 단계와 &amp;amp;nbsp; 두 &amp;amp;nbsp; 가지 &amp;amp;nbsp; 최적화 &amp;amp;nbsp; 경로&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lO80x/dJMcahrLNeU/RtB0LUPHSvjatYHjm8qlD1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlO80x%2FdJMcahrLNeU%2FRtB0LUPHSvjatYHjm8qlD1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1510&quot; height=&quot;868&quot; data-filename=&quot;스크린샷 2026-07-23 오후 4.18.37.png&quot; data-origin-width=&quot;1510&quot; data-origin-height=&quot;868&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Automatic NUMA Balancing &amp;mdash;&amp;nbsp; 스캔 &amp;nbsp;&amp;rarr;&amp;nbsp; 폴트 &amp;nbsp;&amp;rarr;&amp;nbsp; 판단 &amp;nbsp;&amp;rarr;&amp;nbsp; 마이그레이션 &amp;nbsp;4 단계와 &amp;nbsp; 두 &amp;nbsp; 가지 &amp;nbsp; 최적화 &amp;nbsp; 경로&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;# 분산 및 클라우드 컴퓨팅&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; 7.2 &amp;nbsp;&lt;b&gt;NUMA Hinting Fault&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1784791175814&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/* mm/memory.c &amp;mdash; NUMA hinting fault 처리 */
static vm_fault_t do_numa_page(struct vm_fault *vmf)
{
    struct vm_area_struct *vma = vmf-&amp;gt;vma;
    struct page *page;
    int page_nid, target_nid, last_cpupid;
    bool migrated;

	/* 현재 PTE 복원 (PROT_NONE &amp;rarr; 원래 권한) */
    pte = pte_modify(old_pte, vma-&amp;gt;vm_page_prot);

	page = vm_normal_page(vma, vmf-&amp;gt;address, pte);
    page_nid = page_to_nid(page);        /* 페이지의 현재 노드 */
    target_nid = numa_migrate_prep(page, vma, vmf-&amp;gt;address,
                                    page_nid, &amp;amp;flags);

	if (target_nid == NUMA_NO_NODE) {
        /* 마이그레이션 불필요: 이미 최적 위치 */
        put_page(page);
        goto out;
    }

	/* 페이지를 target_nid로 마이그레이션 시도 */
    migrated = migrate_misplaced_page(page, vma, target_nid);
    if (migrated)
        page_nid = target_nid;

out:
    /* NUMA 폴트 통계 업데이트 */
    if (page_nid != NUMA_NO_NODE)
        task_numa_fault(last_cpupid, page_nid,
                       1, flags);
    return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; 7.3 &amp;nbsp;튜닝 파라미터&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1784786553513&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# Automatic NUMA Balancing 활성/비활성
$ sysctl kernel.numa_balancing
kernel.numa_balancing = 1                   # 1=활성, 0=비활성
# 스캔 주기 (ms) &amp;mdash; 폴트가 없으면 점점 늘어남
$ sysctl kernel.numa_balancing_scan_delay_ms
kernel.numa_balancing_scan_delay_ms = 1000  # 초기 스캔 지연
$ sysctl kernel.numa_balancing_scan_period_min_ms
kernel.numa_balancing_scan_period_min_ms = 1000  # 최소 스캔 주기
$ sysctl kernel.numa_balancing_scan_period_max_ms
kernel.numa_balancing_scan_period_max_ms = 60000 # 최대 스캔 주기
# 한 번에 스캔할 페이지 수
$ sysctl kernel.numa_balancing_scan_size_mb
kernel.numa_balancing_scan_size_mb = 256    # MB 단위
# 프로세스별 NUMA 폴트 통계
$ cat /proc/&amp;lt;pid&amp;gt;/sched | grep numa
numa_pages_migrated                          :              12345
numa_preferred_nid                           :              0
total_numa_faults                            :              67890&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;NUMA Balancing&amp;nbsp;비활성화가&amp;nbsp;좋은&amp;nbsp;경우&lt;/span&gt;:&lt;/b&gt;&amp;nbsp;1)&amp;nbsp;이미&amp;nbsp;numactl &lt;b&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;--membind&lt;/span&gt;&lt;/b&gt;로 메모리를 명시적으로 바인딩한 경우, 2) 대규모 인메모리 DB(Redis, memcached)에서 마이그레이션 오버헤드(Overhead)가 크면 성능 저하, 3) 실시간(Real-time)(RT) 워크로드에서 NUMA fault의 지연 시간 편차가 허용 불가, 4) KVM 게스트에서호스트의 NUMA balancing과 충돌할 수 있음. &amp;nbsp; &amp;nbsp;# 운영체제&lt;/span&gt;&lt;/blockquote&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;border-left: #0B2161 10px solid; padding-right: 10px; border-bottom: #0B2161 2px solid; pading-bottom: px; padding-top: 0px; margin: 10px 0px 5px; line-height: 30px;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;b&gt;8. NUMA-aware 스케줄링&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;CFS&amp;nbsp;스케줄러(Scheduler)는&amp;nbsp;NUMA&amp;nbsp;토폴로지를&amp;nbsp;인식하여&amp;nbsp;태스크를&amp;nbsp;배치합니다.&amp;nbsp;스케줄링도메인(sched_domain)&amp;nbsp;계층이&amp;nbsp;NUMA&amp;nbsp;거리를&amp;nbsp;반영합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; 8.1&amp;nbsp; &lt;b&gt;스케줄링&lt;/b&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;b&gt;도메인&lt;/b&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;b&gt;계층&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-07-23 오후 4.20.46.png&quot; data-origin-width=&quot;1510&quot; data-origin-height=&quot;848&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YHsc9/dJMcaiRHBxi/BNJw9CbHxAoFqSlVLX7ky1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YHsc9/dJMcaiRHBxi/BNJw9CbHxAoFqSlVLX7ky1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YHsc9/dJMcaiRHBxi/BNJw9CbHxAoFqSlVLX7ky1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYHsc9%2FdJMcaiRHBxi%2FBNJw9CbHxAoFqSlVLX7ky1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1510&quot; height=&quot;848&quot; data-filename=&quot;스크린샷 2026-07-23 오후 4.20.46.png&quot; data-origin-width=&quot;1510&quot; data-origin-height=&quot;848&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;스케줄링&amp;nbsp;도메인의&amp;nbsp;전체&amp;nbsp;계층&amp;nbsp;구조(SMT &amp;rarr; MC &amp;rarr; CL &amp;rarr; DIE &amp;rarr; NUMA), SD&amp;nbsp;플래그&amp;nbsp;상세, EAS(Energy Aware Scheduling)&amp;nbsp;등은&amp;nbsp;&lt;a style=&quot;color: #333333;&quot; href=&quot;https://www.minzkn.com/linuxkernel/pages/cpu-topology.html#sched-domain&quot;&gt;CPU&amp;nbsp;토폴로지&amp;nbsp;&amp;mdash;&amp;nbsp;스케줄링&amp;nbsp;도메인&lt;/a&gt;에서 상세히 다룹니다. &amp;nbsp; # 분산 및 클라우드 컴퓨팅&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; 8.2 &amp;nbsp; &lt;b&gt;태스크&lt;/b&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;b&gt;선호&lt;/b&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;b&gt;노드&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1784791309562&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/* kernel/sched/fair.c &amp;mdash; NUMA 폴트 기반 선호 노드 결정 */

/*
 * task_struct에서 NUMA 관련 필드:
 */
struct task_struct {
    ...
    int                          numa_preferred_nid;  /* 선호 노드 */
    unsigned long                numa_scan_seq;       /* 스캔 시퀀스 */
    unsigned long                numa_scan_period;    /* 현재 스캔 주기 */
    unsigned long                numa_scan_offset;    /* 스캔 오프셋 */
    struct numa_group            *numa_group;         /* NUMA 그룹 */
    unsigned long                *numa_faults;        /* 노드별 폴트 카운터 */
    unsigned long                total_numa_faults;
    unsigned long                numa_pages_migrated;
    ...
};

/*
 * task_numa_fault()가 폴트 이력을 분석하여
 * 가장 많은 메모리 접근이 발생하는 노드를
 * numa_preferred_nid로 설정합니다.
 *
 * CFS의 wake_affine()과 find_idlest_group()은
 * numa_preferred_nid를 참고하여 태스크 배치를 결정합니다.
 */&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; 8.3 &amp;nbsp;&lt;b&gt;NUMA&amp;nbsp;&lt;/b&gt;&lt;b&gt;그룹&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1784791335587&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/*
 * NUMA 그룹은 메모리를 공유하는 태스크들을 묶어서
 * 함께 같은 노드로 마이그레이션합니다.
 *
 * 예: 멀티스레드 애플리케이션의 스레드들이
 *     같은 공유 메모리를 접근하면 하나의 NUMA 그룹으로 묶임
 *     &amp;rarr; 스케줄러가 그룹 전체를 같은 노드에 배치하려 함
 */

struct numa_group {
    refcount_t       refcount;
    spinlock_t       lock;
    int              nr_tasks;       /* 그룹 내 태스크 수 */
    pid_t            gid;            /* 그룹 ID */
    int              active_nodes;   /* 활성 노드 수 */
    struct rcu_head  rcu;
    unsigned long    total_faults;
    unsigned long    max_faults_cpu;
    unsigned long    faults[];       /* 노드별 집계된 폴트 */
};&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;border-left: #0B2161 10px solid; padding-right: 10px; border-bottom: #0B2161 2px solid; pading-bottom: px; padding-top: 0px; margin: 10px 0px 5px; line-height: 30px;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;b&gt;9. 페이지 마이그레이션&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;NUMA&amp;nbsp;페이지&amp;nbsp;마이그레이션은&amp;nbsp;페이지를&amp;nbsp;한&amp;nbsp;노드에서&amp;nbsp;다른&amp;nbsp;노드로&amp;nbsp;이동시키는&amp;nbsp;메커니즘입니다. NUMA balancing,&amp;nbsp;migrate_pages()&amp;nbsp;시스템&amp;nbsp;콜,&amp;nbsp;메모리&amp;nbsp;핫플러그(Hotplug)&amp;nbsp;등에서&amp;nbsp;사용됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #0b57d0; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;컴퓨터과학&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; 9.1&amp;nbsp; &lt;b&gt;마이그레이션&lt;/b&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;b&gt;흐름&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1784791386318&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/*
 * 페이지 마이그레이션 단계:
 *
 * 1. 대상 노드에 새 페이지 할당
 * 2. 원본 페이지 잠금 (lock_page)
 * 3. 모든 PTE에서 원본 페이지 언매핑 (try_to_migrate)
 *    - PTE를 migration entry로 교체
 *    - 이 동안 접근하는 프로세스는 대기
 * 4. 페이지 데이터 복사 (migrate_folio / copy_highpage)
 * 5. 새 페이지로 PTE 재매핑 (remove_migration_ptes)
 * 6. 원본 페이지 해제
 */

/* mm/migrate.c &amp;mdash; 핵심 마이그레이션 함수 (간략화) */
static int migrate_folio_move(
    free_folio_t put_new_folio,
    unsigned long private,
    struct folio *src,
    struct folio *dst,
    enum migrate_mode mode)
{
    int rc;

	/* 1. 원본 folio 잠금 */
    folio_lock(src);

	/* 2. 모든 매핑에서 PTE 제거 (migration entry 설치) */
    try_to_migrate(src, TTU_BATCH_FLUSH);

	/* 3. 파일시스템/드라이버의 migrate 콜백 호출 */
    rc = move_to_new_folio(dst, src, mode);
    if (rc == MIGRATEPAGE_SUCCESS) {
        /* 4. migration entry를 새 folio의 PTE로 교체 */
        remove_migration_ptes(src, dst, false);
    }

	folio_unlock(src);
    return rc;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-07-23 오후 4.23.41.png&quot; data-origin-width=&quot;1510&quot; data-origin-height=&quot;686&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lxDXo/dJMcaglZ9Vc/zW5RGBGnQmC9kph8egjEXk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lxDXo/dJMcaglZ9Vc/zW5RGBGnQmC9kph8egjEXk/img.png&quot; data-alt=&quot;NUMA&amp;amp;nbsp; 페이지 &amp;amp;nbsp; 마이그레이션 &amp;amp;nbsp;6 단계 &amp;amp;nbsp;&amp;amp;mdash;&amp;amp;nbsp; 할당 / 잠금 (Lock)/ 언매핑 (Unmapping)/ 복사 / 재매핑 / 해제와 &amp;amp;nbsp; 실패 &amp;amp;nbsp; 경로 # 분산 및 클라우드 컴퓨팅&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lxDXo/dJMcaglZ9Vc/zW5RGBGnQmC9kph8egjEXk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlxDXo%2FdJMcaglZ9Vc%2FzW5RGBGnQmC9kph8egjEXk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1510&quot; height=&quot;686&quot; data-filename=&quot;스크린샷 2026-07-23 오후 4.23.41.png&quot; data-origin-width=&quot;1510&quot; data-origin-height=&quot;686&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;NUMA&amp;nbsp; 페이지 &amp;nbsp; 마이그레이션 &amp;nbsp;6 단계 &amp;nbsp;&amp;mdash;&amp;nbsp; 할당 / 잠금 (Lock)/ 언매핑 (Unmapping)/ 복사 / 재매핑 / 해제와 &amp;nbsp; 실패 &amp;nbsp; 경로 # 분산 및 클라우드 컴퓨팅&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; 9.2 &lt;b&gt;마이그레이션&lt;/b&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;b&gt;도구&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1784791469620&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 프로세스의 모든 페이지를 node0에서 node1로 이동
$ migratepages &amp;lt;pid&amp;gt; 0 1

# 특정 메모리 영역을 다른 노드로 바인딩 (기존 페이지도 이동)
$ numactl --membind=1 --touch ./app
# 또는 mbind() + MPOL_MF_MOVE 플래그

# 마이그레이션 통계 확인
$ cat /proc/vmstat | grep numa
numa_pte_updates 1234567      # NUMA hinting fault용 PTE 변경 수
numa_huge_pte_updates 12345  # hugepage PTE 변경 수
numa_hint_faults 567890      # NUMA hinting fault 발생 수
numa_hint_faults_local 456789 # 로컬 노드 접근 (이동 불필요)
numa_pages_migrated 98765    # 마이그레이션된 페이지 수
pgmigrate_success 98000      # 성공한 마이그레이션
pgmigrate_fail 765           # 실패한 마이그레이션&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;border-left: #0B2161 10px solid; padding-right: 10px; border-bottom: #0B2161 2px solid; pading-bottom: px; padding-top: 0px; margin: 10px 0px 5px; line-height: 30px;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;b&gt;10. &amp;nbsp;NUMA-aware 서브시스템&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;커널의 주요 서브시스템은 NUMA를 인식하여 데이터를 로컬 노드에 배치합니다. &amp;nbsp; &amp;nbsp;# 컴퓨터 메모리&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; 10.1&amp;nbsp; &lt;b&gt;Slab&amp;nbsp;&lt;/b&gt;&lt;b&gt;할당기&lt;/b&gt;&lt;b&gt; (SLUB)&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1784791519875&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/*
 * SLUB 할당기는 노드별로 독립적인 partial slab 리스트를 유지합니다.
 *
 * struct kmem_cache_node {
 *     spinlock_t list_lock;
 *     unsigned long nr_partial;      // 부분 사용 slab 수
 *     struct list_head partial;      // partial slab 리스트
 * };
 *
 * kmem_cache는 노드별 kmem_cache_node를 배열로 관리:
 * kmem_cache-&amp;gt;node[MAX_NUMNODES]
 *
 * 할당 흐름:
 * 1. 현재 CPU의 per-cpu slab에서 시도 (가장 빠름)
 * 2. 현재 노드의 partial 리스트에서 시도
 * 3. 다른 노드의 partial 리스트에서 시도 (cross-node)
 * 4. 새 slab 페이지 할당 (현재 노드 우선)
 */

# 노드별 slab 통계
$ cat /proc/slabinfo  # 전체 통계
$ slabinfo -N 0       # node0의 slab 정보

# slabtop으로 실시간 모니터링
$ slabtop -s c&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; 10.2 &amp;nbsp;&lt;b&gt;Per-CPU&amp;nbsp;&lt;/b&gt;&lt;b&gt;변수와&lt;/b&gt;&lt;b&gt; NUMA&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1784791544018&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/*
 * Per-CPU 변수는 각 CPU의 로컬 NUMA 노드에 할당됩니다.
 * pcpu_alloc()이 cpu_to_node()를 사용하여 적절한 노드에 메모리 배치.
 *
 * 부팅 시 per-cpu 영역 초기화:
 * setup_per_cpu_areas() &amp;rarr; pcpu_embed_first_chunk()
 * &amp;rarr; 각 CPU에 대해 해당 노드의 메모리에 per-cpu 영역 할당
 */

/* 올바른 NUMA-aware per-CPU 사용 */
DEFINE_PER_CPU(struct my_stats, cpu_stats);

/* 접근 시 preemption 비활성화 필수 (다른 CPU로 이동 방지) */
preempt_disable();
this_cpu_inc(cpu_stats.counter);   /* 로컬 NUMA 노드 접근 보장 */
preempt_enable();

/* NUMA-aware workqueue */
alloc_workqueue(&quot;my_wq&quot;, WQ_UNBOUND | WQ_NUMA, 0);
/* WQ_NUMA: work item을 제출한 CPU의 NUMA 노드에서 실행 */&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; 10.3 &amp;nbsp;&lt;b&gt;네트워크&lt;/b&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;b&gt;스택&lt;/b&gt;&lt;b&gt;(Network Stack)&lt;/b&gt;&lt;b&gt;과&lt;/b&gt;&lt;b&gt; NUMA&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1784791569197&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/* NIC의 NUMA 노드 확인 */
$ cat /sys/class/net/eth0/device/numa_node
0

/* IRQ를 NIC의 로컬 노드 CPU에 바인딩 (최적 성능) */
# NIC가 node0에 있으면 node0의 CPU에 IRQ 할당
$ echo 0-7 &amp;gt; /proc/irq/&amp;lt;irq&amp;gt;/smp_affinity_list

/* NUMA-aware sk_buff 할당 */
/* 네트워크 드라이버에서 NIC 로컬 노드의 메모리로 sk_buff 할당:
 * dev_alloc_skb() &amp;rarr; __netdev_alloc_skb()
 *   &amp;rarr; 현재 CPU의 page_frag 캐시 사용
 *   &amp;rarr; NAPI 컨텍스트에서는 NIC의 로컬 노드에서 할당
 */

# ethtool로 RX/TX 큐 확인
$ ethtool -l eth0
Channel parameters for eth0:
Pre-set maximums:
    RX:     0
    TX:     0
    Other:  0
    Combined:   32
Current hardware settings:
    Combined:   16

# 각 큐의 IRQ가 NIC 로컬 노드에 바인딩되었는지 확인
$ for irq in $(grep eth0 /proc/interrupts | awk '{print $1}' | tr -d ':'); do
    echo &quot;IRQ $irq: node $(cat /proc/irq/$irq/node)&quot;
done&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;border-left: #0B2161 10px solid; padding-right: 10px; border-bottom: #0B2161 2px solid; pading-bottom: px; padding-top: 0px; margin: 10px 0px 5px; line-height: 30px;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;b&gt;11. &amp;nbsp;NUMA와 메모리 회수 (Memory Reclaim)&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;각 NUMA 노드는 자체 kswapd 스레드(Thread)를 가지며, 노드별로 독립적으로 메모리 회수(reclaim)가수행됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp; # 분산 및 클라우드 컴퓨팅&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-07-23 오후 4.26.49.png&quot; data-origin-width=&quot;1510&quot; data-origin-height=&quot;716&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cSrESC/dJMcaidadVj/44Z9PVob3vKkFWiwKiVCn1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cSrESC/dJMcaidadVj/44Z9PVob3vKkFWiwKiVCn1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cSrESC/dJMcaidadVj/44Z9PVob3vKkFWiwKiVCn1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcSrESC%2FdJMcaidadVj%2F44Z9PVob3vKkFWiwKiVCn1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1510&quot; height=&quot;716&quot; data-filename=&quot;스크린샷 2026-07-23 오후 4.26.49.png&quot; data-origin-width=&quot;1510&quot; data-origin-height=&quot;716&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1784791633811&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/*
 * NUMA 노드별 kswapd:
 *
 * Node 0: kswapd0 &amp;rarr; node0의 존들을 모니터링/회수
 * Node 1: kswapd1 &amp;rarr; node1의 존들을 모니터링/회수
 *
 * 각 kswapd는 자기 노드의 워터마크를 기준으로 동작:
 * - pages_free &amp;lt; watermark_low &amp;rarr; kswapd 깨어남
 * - pages_free &amp;gt; watermark_high &amp;rarr; kswapd 슬립
 *
 * 문제: Node 0이 메모리 부족해도 Node 1에 충분하면
 *       시스템 전체로는 여유가 있지만 Node 0에서 OOM 발생 가능
 */

# 노드별 kswapd 확인
$ ps aux | grep kswapd
root   31  0.0  0.0  0  0 S  ? 0:05 [kswapd0]
root   32  0.0  0.0  0  0 S  ? 0:03 [kswapd1]

# 노드별 워터마크 확인
$ cat /proc/zoneinfo | grep -A5 &quot;Node 0, zone   Normal&quot;
Node 0, zone   Normal
  pages free     12057500
        boost    0
        min      16384
        low      20480
        high     24576&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; 11.1&amp;nbsp; &lt;b&gt;Zone Reclaim Mode&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1784791653834&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# zone_reclaim_mode &amp;mdash; 로컬 노드 메모리 부족 시 동작 제어
$ sysctl vm.zone_reclaim_mode
vm.zone_reclaim_mode = 0

# 비트 플래그:
# 0 (기본): 로컬 노드 부족 시 리모트 노드에서 할당 (대부분의 경우 최적)
# 1 (RECLAIM_ZONE):  로컬 존에서 페이지 회수 시도
# 2 (RECLAIM_WRITE): 더티 페이지 쓰기 후 회수
# 4 (RECLAIM_UNMAP): 매핑된 페이지도 언매핑 후 회수

# zone_reclaim_mode=1이 유리한 경우:
# - NUMA ratio가 매우 큰 시스템 (3x 이상)
# - 메모리 접근 패턴이 극도로 로컬한 워크로드
# - 파일 캐시보다 애플리케이션 데이터가 중요한 경우

# 대부분의 경우 zone_reclaim_mode=0이 권장됨:
# - 리모트 노드 할당 비용 &amp;lt; 페이지 회수 비용
# - 파일 캐시 유지가 전체 성능에 유리&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;border-left: #0B2161 10px solid; padding-right: 10px; border-bottom: #0B2161 2px solid; pading-bottom: px; padding-top: 0px; margin: 10px 0px 5px; line-height: 30px;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;b&gt;12. &amp;nbsp;MNUMA-aware I/O&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;PCIe 장치(NVMe SSD, GPU, NIC 등)는 특정 NUMA 노드에 물리적으로 연결됩니다. I/O 요청이 장치와 다른NUMA 노드에서 발생하면 인터커넥트를 경유하여 지연이 증가하고 대역폭이 감소합니다. 고성능 I/O 워크로드에서는 장치의 NUMA 친화성(Affinity)을 반드시 고려해야 합니다. &amp;nbsp; # 컴퓨터 메모리&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-07-23 오후 4.27.56.png&quot; data-origin-width=&quot;1510&quot; data-origin-height=&quot;716&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bSk6zl/dJMcahFcCEt/WZsEp0ZcFuX4kTmCOKjrK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bSk6zl/dJMcahFcCEt/WZsEp0ZcFuX4kTmCOKjrK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bSk6zl/dJMcahFcCEt/WZsEp0ZcFuX4kTmCOKjrK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbSk6zl%2FdJMcahFcCEt%2FWZsEp0ZcFuX4kTmCOKjrK0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1510&quot; height=&quot;716&quot; data-filename=&quot;스크린샷 2026-07-23 오후 4.27.56.png&quot; data-origin-width=&quot;1510&quot; data-origin-height=&quot;716&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; 11.1&amp;nbsp; &lt;b&gt;NVMe&lt;/b&gt;&lt;b&gt;와&lt;/b&gt;&lt;b&gt;&amp;nbsp;NUMA&lt;/b&gt;Yocto Project 소개&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1784791704474&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# NVMe 장치의 NUMA 노드 확인
$ cat /sys/block/nvme0n1/device/numa_node
0
$ cat /sys/block/nvme1n1/device/numa_node
1

# NVMe 큐의 IRQ가 올바른 노드에 바인딩되었는지 확인
$ for irq in $(grep nvme0 /proc/interrupts | awk '{print $1}' | tr -d ':'); do
    echo &quot;IRQ $irq &amp;rarr; node $(cat /proc/irq/$irq/node), CPUs: $(cat /proc/irq/$irq/smp_affinity_list)&quot;
done

# 최적 설정: NVMe 큐당 1개 IRQ, 로컬 노드 CPU에 매핑
# io_uring/fio에서 NUMA 인식 I/O 테스트
$ numactl --cpunodebind=0 --membind=0 fio \
    --ioengine=io_uring --direct=1 --bs=4k --iodepth=128 \
    --filename=/dev/nvme0n1 --rw=randread --numjobs=8
# 비교: --cpunodebind=1 (리모트 노드)로 실행하면 IOPS 10-30% 감소&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; 11.2 &amp;nbsp;&lt;b&gt;블록&lt;/b&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;b&gt;장치&lt;/b&gt;&lt;b&gt;(Block Device)&amp;nbsp;&lt;/b&gt;&lt;b&gt;레이어와&lt;/b&gt;&lt;b&gt;&amp;nbsp;NUMA&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1784791744660&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/*
 * 블록 장치의 NUMA-aware 동작:
 *
 * 1. blk-mq (Multi-Queue Block Layer):
 *    - 하드웨어 큐(hctx)가 CPU별로 매핑
 *    - hctx-&amp;gt;numa_node로 큐의 NUMA 친화성 설정
 *    - 요청 메모리를 큐의 로컬 노드에서 할당
 *
 * 2. I/O 스케줄러 (mq-deadline, bfq, kyber):
 *    - 요청 병합/정렬에 NUMA 고려 없음 (장치 레벨 최적화)
 *    - 그러나 I/O 제출 CPU의 NUMA 위치가 성능에 영향
 *
 * 3. Page Cache와 NUMA:
 *    - 파일 읽기 시 page cache는 읽기 CPU의 로컬 노드에 할당
 *    - 여러 노드에서 같은 파일 접근 시 NUMA balancing 가능
 */

/* block/blk-mq.c &amp;mdash; NUMA-aware 하드웨어 큐 매핑 */
static int blk_mq_hw_ctx_set_numa_node(
    struct blk_mq_hw_ctx *hctx,
    struct blk_mq_tag_set *set)
{
    /* 장치의 NUMA 노드에 큐를 매핑 */
    hctx-&amp;gt;numa_node = set-&amp;gt;numa_node;
    /* 큐의 요청 메모리를 이 노드에서 할당 */
    return 0;
}

# blk-mq NUMA 설정 확인
$ cat /sys/block/nvme0n1/queue/numa_node
0&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;irqbalance와&amp;nbsp;NUMA: &lt;span style=&quot;color: #009a87;&quot;&gt;irqbalance&lt;/span&gt;&lt;/b&gt; 데몬은 기본적으로 NUMA 토폴로지를 인식하여 IRQ를 장치의 로컬 노드에배분합니다. 그러나 고성능 환경에서는 &lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;irqbalance&lt;/b&gt;&lt;/span&gt;를 비활성화하고 수동으로 &lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;/proc/irq/*/smp_affinity&lt;/b&gt;&lt;/span&gt;를 설정하는것이 더 안정적입니다. 특히 DPDK나 SPDK를 사용하는 경우 IRQ 바인딩을 직접 관리해야 합니다. &amp;nbsp; &amp;nbsp;# 컴퓨터 과학&lt;/span&gt;&lt;/blockquote&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;border-left: #0B2161 10px solid; padding-right: 10px; border-bottom: #0B2161 2px solid; pading-bottom: px; padding-top: 0px; margin: 10px 0px 5px; line-height: 30px;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;b&gt;12. &amp;nbsp;CXL과 이종 NUMA&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;CXL(&lt;a style=&quot;color: #333333;&quot; href=&quot;https://www.minzkn.com/linuxkernel/pages/numa.html&quot;&gt;&amp;nbsp;Compute Express Link&lt;/a&gt;)은&amp;nbsp;CPU에&amp;nbsp;외부&amp;nbsp;메모리를&amp;nbsp;연결하여&amp;nbsp;NUMA&amp;nbsp;노드로&amp;nbsp;노출하는&amp;nbsp;새로운&amp;nbsp;인터커넥트기술입니다. CXL&amp;nbsp;메모리는&amp;nbsp;로컬&amp;nbsp;DRAM보다&amp;nbsp;지연이&amp;nbsp;크지만,&amp;nbsp;용량&amp;nbsp;확장과&amp;nbsp;비용&amp;nbsp;효율성을&amp;nbsp;제공합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; 12.1&amp;nbsp; &lt;b&gt;CXL&amp;nbsp;&lt;/b&gt;&lt;b&gt;메모리&lt;/b&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;b&gt;토폴로지&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-07-23 오후 4.30.19.png&quot; data-origin-width=&quot;1510&quot; data-origin-height=&quot;716&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bLn7gz/dJMcaa0pitT/EmApuEdqlsZKihLCtbqDr1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bLn7gz/dJMcaa0pitT/EmApuEdqlsZKihLCtbqDr1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bLn7gz/dJMcaa0pitT/EmApuEdqlsZKihLCtbqDr1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbLn7gz%2FdJMcaa0pitT%2FEmApuEdqlsZKihLCtbqDr1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1510&quot; height=&quot;716&quot; data-filename=&quot;스크린샷 2026-07-23 오후 4.30.19.png&quot; data-origin-width=&quot;1510&quot; data-origin-height=&quot;716&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1784791839388&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# CXL 메모리 노드 확인
$ dmesg | grep cxl
cxl_acpi ACPI0017:00: CXL region registered
cxl_mem mem0: CXL Type 3 device, 256 GB

# CXL 노드의 HMAT (Heterogeneous Memory Attribute Table) 정보
$ cat /sys/devices/system/node/node2/access0/initiators/read_latency
170
$ cat /sys/devices/system/node/node2/access0/initiators/read_bandwidth
32000&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; 12.2 &amp;nbsp;&lt;b&gt;Weighted Interleave (v6.9+)&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1784791869148&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/*
 * CXL처럼 노드 간 대역폭이 다른 이종 NUMA 환경에서는
 * 단순 라운드-로빈 인터리브가 비효율적입니다.
 *
 * Weighted Interleave는 노드별 대역폭 비율에 맞춰
 * 페이지를 가중 분산합니다.
 *
 * 예: Node0 (DRAM, 50GB/s) + Node2 (CXL, 16GB/s)
 * 가중치: Node0=3, Node2=1
 * &amp;rarr; 4페이지 중 3페이지는 Node0, 1페이지는 Node2에 할당
 */

# 가중치 설정 (sysfs)
$ echo 3 &amp;gt; /sys/kernel/mm/mempolicy/weighted_interleave/node0
$ echo 1 &amp;gt; /sys/kernel/mm/mempolicy/weighted_interleave/node2

# 프로세스에 weighted interleave 정책 적용
# set_mempolicy(MPOL_WEIGHTED_INTERLEAVE, nodemask, maxnode)
$ numactl --weighted-interleave=0,2 ./memory_intensive_app&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;MPOL_WEIGHTED_INTERLEAVE&lt;/b&gt;&lt;/span&gt;는&amp;nbsp;메모리&amp;nbsp;정책(Memory Policy)&amp;nbsp;관점에서&amp;nbsp;&lt;b&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;MPOL_INTERLEAVE&lt;/span&gt;&lt;/b&gt;의 상위호환입니다. 차이는 &quot;다음 노드를 어떤 비율로 고를지&quot;를 단순 라운드-로빈이 아니라 sysfs 가중치로선택한다는 점뿐이며, 익명 페이지(Anonymous Page)와 공유 메모리(Shared Memory)는 faulting address의페이지 오프셋(Offset)을 기준으로, page cache는 태스크별 카운터를 기준으로 분산된다는 큰 구조는 그대로유지됩니다. &amp;nbsp; &amp;nbsp;# 분산 및 클라우드 컴퓨팅&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;color: #000000; text-align: start; border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; width=&quot;763&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style13&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;할당 대상&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;MPOL_INTERLEAVE&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;WEIGHTED_INTERLEAVE&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;운영 해석&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;익명 페이지&amp;nbsp;/&amp;nbsp;공유 메모리&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;faulting address의 페이지 오프셋을nodemask에 라운드-로빈 적용&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;같은 오프셋 경로를 사용하되 노드 선택 비율만 가중치로 조정&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;대형 배열, CXL&amp;nbsp;혼합 메모리처럼 주소 범위가 뚜렷한 워크로드에서 해석이 쉽습니다.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;page cache&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;태스크별&amp;nbsp;interleave&amp;nbsp;카운터로 노드 순환&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;같은 카운터 경로를 사용하되 비율만 가중치에 맞춰 변경&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;파일 읽기 순서, readahead,&amp;nbsp;제출 스레드 수에 따라 분산 모양이 달라질 수 있습니다.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;정규 파일의MAP_SHARED&amp;nbsp;매핑&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;VMA&amp;nbsp;정책이 아니라task&amp;nbsp;정책 또는&amp;nbsp;system default policy를 따릅니다.&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;가중치 정책도 동일한 예외를 가집니다.&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;mbind()를 걸었다고 해서&amp;nbsp;shared file page cache에 그대로 적용된다고 보면 안 됩니다.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; 12.3 &amp;nbsp;&lt;b&gt;메모리&lt;/b&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;b&gt;티어링&lt;/b&gt;&lt;b&gt; (Memory Tiering)&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-07-23 오후 4.31.56.png&quot; data-origin-width=&quot;1510&quot; data-origin-height=&quot;670&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c37DEF/dJMcaiqANP7/dx859KclhQRDOchITXixfk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c37DEF/dJMcaiqANP7/dx859KclhQRDOchITXixfk/img.png&quot; data-alt=&quot;메모리 &amp;amp;nbsp; 티어링 &amp;amp;nbsp;&amp;amp;mdash; DRAM(Tier 0) 과 &amp;amp;nbsp;CXL(Tier 1)&amp;amp;nbsp; 간 &amp;amp;nbsp; 자동 &amp;amp;nbsp; 프로모션 / 디모션 &amp;amp;nbsp; 흐름과 &amp;amp;nbsp; 트리거 &amp;amp;nbsp; 조건&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c37DEF/dJMcaiqANP7/dx859KclhQRDOchITXixfk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc37DEF%2FdJMcaiqANP7%2Fdx859KclhQRDOchITXixfk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1510&quot; height=&quot;670&quot; data-filename=&quot;스크린샷 2026-07-23 오후 4.31.56.png&quot; data-origin-width=&quot;1510&quot; data-origin-height=&quot;670&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;메모리 &amp;nbsp; 티어링 &amp;nbsp;&amp;mdash; DRAM(Tier 0) 과 &amp;nbsp;CXL(Tier 1)&amp;nbsp; 간 &amp;nbsp; 자동 &amp;nbsp; 프로모션 / 디모션 &amp;nbsp; 흐름과 &amp;nbsp; 트리거 &amp;nbsp; 조건&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;# 칩 및 프로세서&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1784791977698&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/*
 * 커널 메모리 티어링 (v5.18+):
 *
 * Tier 0 (Fast): Local DRAM (Node 0, 1)
 * Tier 1 (Slow): CXL Memory (Node 2) / 영구 메모리 (PMEM)
 *
 * 핫 페이지는 Tier 0으로 프로모션
 * 콜드 페이지는 Tier 1로 디모션
 *
 * kswapd가 Tier 0 메모리 부족 시:
 * - 콜드 페이지를 Tier 1으로 디모션 (기존: swap/discard)
 * - Tier 1에서 핫 접근 감지 시 Tier 0으로 프로모션
 */

# 디모션 타겟 설정
$ cat /sys/devices/system/node/node0/memtier
1
$ cat /sys/devices/system/node/node2/memtier
2

# 노드 간 디모션 경로
$ cat /sys/devices/system/node/node0/demotion_targets
2    # Node 0의 콜드 페이지는 Node 2(CXL)로 이동

# 디모션 활성화
$ echo 1 &amp;gt; /sys/kernel/mm/numa/demotion_enabled

# 프로모션 통계
$ cat /proc/vmstat | grep pgpromote
pgpromote_success 12345     # Tier 1 &amp;rarr; Tier 0 프로모션 성공
pgdemote_kswapd 67890       # kswapd에 의한 디모션
pgdemote_direct 1234        # direct reclaim에 의한 디모션&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;참고&lt;/span&gt;:&lt;/b&gt;&amp;nbsp;CXL.mem/cache/io&amp;nbsp;프로토콜, Type1/2/3&amp;nbsp;장치, drivers/cxl/&amp;nbsp;구조, memory_tier&amp;nbsp;자동demotion/promotion, LLM KV&amp;nbsp;캐시&amp;nbsp;CXL&amp;nbsp;배치는&amp;nbsp;&lt;a style=&quot;color: #333333;&quot; href=&quot;https://www.minzkn.com/linuxkernel/pages/cxl-memory.html&quot;&gt;CXL&amp;nbsp;메모리&lt;/a&gt; 페이지에서 자세히 다룹니다. &amp;nbsp; &amp;nbsp; # 컴퓨터 메모리&lt;/span&gt;&lt;/blockquote&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #0b57d0; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;컴퓨터&amp;nbsp;메모리&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;border-left: #0B2161 10px solid; padding-right: 10px; border-bottom: #0B2161 2px solid; pading-bottom: px; padding-top: 0px; margin: 10px 0px 5px; line-height: 30px;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;b&gt;13. &amp;nbsp;가상화 (Virtualization)와 vNUMA&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;KVM&amp;nbsp;가상화&amp;nbsp;환경에서&amp;nbsp;게스트&amp;nbsp;VM에&amp;nbsp;NUMA&amp;nbsp;토폴로지를&amp;nbsp;노출하면&amp;nbsp;게스트&amp;nbsp;OS가&amp;nbsp;NUMA-aware&amp;nbsp;최적화를수행할&amp;nbsp;수&amp;nbsp;있습니다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;i&gt;&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1784792035189&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# QEMU/KVM에서 vNUMA 설정
$ qemu-system-x86_64 \
    -smp 16,sockets=2,cores=4,threads=2 \
    -m 16G \
    -object memory-backend-ram,size=8G,id=ram0,host-nodes=0,policy=bind \
    -object memory-backend-ram,size=8G,id=ram1,host-nodes=1,policy=bind \
    -numa node,memdev=ram0,cpus=0-7,nodeid=0 \
    -numa node,memdev=ram1,cpus=8-15,nodeid=1 \
    -numa dist,src=0,dst=1,val=21 \
    ...

# libvirt XML에서 vNUMA 설정
&amp;lt;cpu&amp;gt;
  &amp;lt;numa&amp;gt;
    &amp;lt;cell id='0' cpus='0-7' memory='8388608' unit='KiB'/&amp;gt;
    &amp;lt;cell id='1' cpus='8-15' memory='8388608' unit='KiB'/&amp;gt;
  &amp;lt;/numa&amp;gt;
&amp;lt;/cpu&amp;gt;
&amp;lt;numatune&amp;gt;
  &amp;lt;memory mode='strict' nodeset='0-1'/&amp;gt;
  &amp;lt;memnode cellid='0' mode='strict' nodeset='0'/&amp;gt;
  &amp;lt;memnode cellid='1' mode='strict' nodeset='1'/&amp;gt;
&amp;lt;/numatune&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;vNUMA&amp;nbsp;&lt;/b&gt;&lt;b&gt;핀닝&lt;/b&gt;&lt;b&gt;:&lt;/b&gt; 게스트의 vNUMA 노드를 호스트의 물리 NUMA 노드에 고정(pin)하는 것이 중요합니다. 핀닝없이 게스트의 vCPU가 호스트의 다른 노드로 마이그레이션되면, 게스트 내부에서 &quot;로컬&quot;이라고 인식한메모리가 실제로는 호스트의 리모트 노드에 있게 되어 성능이 급격히 저하됩니다. &amp;nbsp; &amp;nbsp; # 칩 및 프로세서&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;border-left: #0B2161 10px solid; padding-right: 10px; border-bottom: #0B2161 2px solid; pading-bottom: px; padding-top: 0px; margin: 10px 0px 5px; line-height: 30px;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;b&gt;14. &amp;nbsp;성능 분석과 최적화&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; 14.1&amp;nbsp; &lt;b&gt;perf&lt;/b&gt;&lt;b&gt;로&lt;/b&gt;&lt;b&gt;&amp;nbsp;NUMA&amp;nbsp;&lt;/b&gt;&lt;b&gt;분석&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1784787152631&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# NUMA 관련 하드웨어 카운터 수집
$ perf stat -e \
    node-loads,node-load-misses,\
    node-stores,node-store-misses \
    -- ./my_application
 Performance counter stats for './my_application':
     142,857,391      node-loads          # 메모리 로드 총 수
       1,234,567      node-load-misses    # 리모트 노드 로드 (0.86%)
      98,234,567      node-stores
         345,678      node-store-misses   # 리모트 노드 스토어
# NUMA 미스 비율이 높은 함수 프로파일링
$ perf record -e node-load-misses -g -- ./my_application
$ perf report --sort=dso,symbol
# perf c2c &amp;mdash; NUMA false sharing / remote access 분석
$ perf c2c record -- ./my_application
$ perf c2c report --stdio
=================================================
           Shared Data Cache Line Table
=================================================
       Num     RmtHitm  LclHitm    Stores  ...
  ----- -------- ------- ------- --------
     0      1234     56    7890  ...
     Address: 0x7f8a...
     Source:  my_struct+0x40 (my_module.c:123)&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;perf&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;도구를 활용해 NUMA 원격 접근(Remote Access)과 False Sharing을 실전에서 분석하는 훌륭한 워크플로우 예시입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;출력 데이터에서 발견할 수 있는 핵심 포인트와 실무적 해석을 정리해 드립니다.&lt;/span&gt;&lt;/p&gt;
&lt;div id=&quot;model-response-message-contentr_57f611c8254bfdcc&quot; style=&quot;color: #000000; text-align: start;&quot;&gt;
&lt;p data-path-to-node=&quot;3&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp; (1)&lt;span&gt;&amp;nbsp;&lt;/span&gt;perf stat: 전반적인 NUMA 건강 상태 측정&lt;/b&gt;&lt;/p&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwju9pCIi-iVAxUAAAAAHQAAAAAQvgE&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;crmsh&quot;&gt;&lt;code&gt;  142,857,391  node-loads
    1,234,567  node-load-misses  # 리모트 노드 로드 (0.86%)
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;5&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,0,0&quot;&gt;해석:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;메모리 읽기 중 타 노드의 메모리를 참조한 비율(Remote Load)이&lt;span&gt;&amp;nbsp;&lt;/span&gt;0.86%로 매우 낮습니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,1,0&quot;&gt;결론:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;애플리케이션의 메모리 할당 정책(Memory Affinity)이 잘 유지되고 있으며, 일반적인 메모리 접근 면에서는 NUMA 바인딩 이슈가 거의 없는 우수한 상태입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-path-to-node=&quot;7&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;7&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp; (2)&lt;span&gt;&amp;nbsp;&lt;/span&gt;perf record / report: 원인 함수 타겟팅&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;8&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;node-load-misses&lt;span&gt;&amp;nbsp;&lt;/span&gt;비율이 전체적으로 낮더라도,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b data-index-in-node=&quot;33&quot; data-path-to-node=&quot;8,0,0&quot;&gt;특정 핫스팟 함수가 병목을 유발&lt;/b&gt;하는지 확인할 때 유용합니다.&lt;/li&gt;
&lt;li&gt;Callgraph(-g) 옵션을 함께 사용하여 어떤 함수 호출 경로에서 Remote Read가 발생하는지 핀포인트로 찾아낼 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-path-to-node=&quot;10&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;10&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp; (3)&lt;span&gt;&amp;nbsp;&lt;/span&gt;perf c2c&lt;span&gt;&amp;nbsp;&lt;/span&gt;(Cache-to-Cache): True / False Sharing 분석&lt;/b&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;11&quot; data-ke-size=&quot;size16&quot;&gt;perf c2c는 단순 메모리 미스를 넘어 캐시 라인(64 Byte) 단위의 캐시 바운싱(HITM: Hit In Modified Cache)을 추적합니다.&lt;/p&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwju9pCIi-iVAxUAAAAAHQAAAAAQvwE&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;&lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;Shared Data Cache Line Table
Num   RmtHitm  LclHitm
 0     1234      56    Address: 0x7f8a...  Source: my_struct+0x40 (my_module.c:123)
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;13&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;13,0,0&quot;&gt;RmtHitm&lt;span&gt;&amp;nbsp;&lt;/span&gt;(Remote Hit Modified) = 1,234회:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;13,0,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;13,0,1,0,0&quot;&gt;의미:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;다른 NUMA 노드의 CPU 캐시에 들어있던 '수정된(Modified)' 캐시 라인을 가져오느라 심각한 레이턴시(Interconnect 통신)가 발생한 횟수입니다.&lt;/li&gt;
&lt;li&gt;전체 Remote Load Miss(123만 회) 중 상당수가 이 특정 구조체 주소(my_struct+0x40)에서 집중적으로 터지고 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;13,1,0&quot;&gt;원인 (False Sharing 가능성):&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;13,1,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;my_struct&lt;span&gt;&amp;nbsp;&lt;/span&gt;내의 특정 64바이트 캐시 라인 안에&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b data-index-in-node=&quot;31&quot; data-path-to-node=&quot;13,1,1,0,0&quot;&gt;Node 0의 CPU가 자주 쓰는 변수&lt;/b&gt;와&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b data-index-in-node=&quot;54&quot; data-path-to-node=&quot;13,1,1,0,0&quot;&gt;Node 1의 CPU가 자주 쓰는 변수&lt;/b&gt;가 같이 묶여 있을 확률이 높습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-path-to-node=&quot;15&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; ️ 해결 방안 (Code-Level Fix)&lt;/b&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;16&quot; data-ke-size=&quot;size16&quot;&gt;perf c2c로 찾은&lt;span&gt;&amp;nbsp;&lt;/span&gt;my_struct+0x40의 False Sharing을 해결하려면 캐시 라인 정렬(Cache Line Alignment)을 적용해야 합니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;17&quot; data-ke-size=&quot;size16&quot;&gt;C/C++ 구조체 패딩 적용 예시&lt;/p&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwju9pCIi-iVAxUAAAAAHQAAAAAQwAE&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;cpp&quot;&gt;&lt;code&gt;struct my_struct {
    /* Node 0 CPU들이 자주 쓰는 변수 */
    uint64_t node0_counter;

    /* 64 바이트 경계로 정렬하여 캐시 라인을 분리 */
    alignas(64) uint64_t node1_counter; 
};
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-path-to-node=&quot;19&quot; data-ke-size=&quot;size16&quot;&gt;이렇게 정렬해주면 두 변수가 서로 다른 캐시 라인에 위치하게 되어, 타 노드 CPU가 값을 변경하더라도 내 캐시 라인이 Invalidate(무효화)되는 현상을 완전히 막을 수 있습니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;21&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; 14.2 &amp;nbsp;&lt;b&gt;numastat&amp;nbsp;&lt;/b&gt;&lt;b&gt;분석&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1784787258998&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 시스템 전체 NUMA 통계
$ numastat
                           node0           node1
numa_hit               142857391       98234567   # 의도한 노드에서 할당 성공
numa_miss                1234567        2345678   # 의도한 노드 실패 &amp;rarr; 다른 노드
numa_foreign             2345678        1234567   # 다른 노드의 miss가 여기서 충족
interleave_hit           3456789        3456789   # interleave 정책 적중
local_node             139400824       95888889   # 로컬 CPU에서 로컬 메모리 할당
other_node               4690134        4690356   # 리모트 CPU에서 로컬 메모리 할당
# 높은 numa_miss &amp;rarr; NUMA 정책 조정 필요
# 높은 other_node &amp;rarr; 태스크가 잘못된 노드에서 실행 중
# numa_miss / numa_hit 비율이 5% 이상이면 최적화 검토
# 프로세스별 NUMA 메모리 분포
$ numastat -p &amp;lt;pid&amp;gt;
$ numastat -c qemu-kvm   # 특정 프로세스 이름으로 조회&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div id=&quot;model-response-message-contentr_66564f8ec526bf4f&quot; style=&quot;color: #000000; text-align: start;&quot;&gt;
&lt;p data-path-to-node=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;numastat을 통해 시스템 레벨 및 프로세스 레벨에서 NUMA 할당 불균형을 진단하는 명확한 기준을 보여주는 자료입니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;1&quot; data-ke-size=&quot;size16&quot;&gt;표시해주신 주석의 핵심 내용을 커널 메모리 할당 매커니즘과 연관 지어 정리해 드립니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;3&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;3&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp; (1)&lt;span&gt;&amp;nbsp;&lt;/span&gt;numastat&lt;span&gt;&amp;nbsp;&lt;/span&gt;카운터 상호 관계 분석&lt;/b&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;4&quot; data-ke-size=&quot;size16&quot;&gt;numastat&lt;span&gt;&amp;nbsp;&lt;/span&gt;결과는 커널 내부 메트릭을 보여주며, 세 카운터 간에는 다음과 같은 방정식이 성립합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;5&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,0,0&quot;&gt;numa_miss(A)&lt;span&gt;&amp;nbsp;&lt;/span&gt;=&lt;span&gt;&amp;nbsp;&lt;/span&gt;numa_foreign(B)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;5,0,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Node 0에서 메모리를 할당하려고 했으나 실패하여(numa_miss&lt;span&gt;&amp;nbsp;&lt;/span&gt;on Node 0), 대신 Node 1의 메모리를 할당받은 경우(numa_foreign&lt;span&gt;&amp;nbsp;&lt;/span&gt;on Node 1), 두 수치는 1:1로 대칭을 이룹니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,1,0&quot;&gt;local_node&lt;span&gt;&amp;nbsp;&lt;/span&gt;vs&lt;span&gt;&amp;nbsp;&lt;/span&gt;other_node&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;5,1,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,1,1,0,0&quot;&gt;local_node:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;해당 노드의 CPU가 실행 중일 때, 자신 노드의 메모리를 할당받은 횟수 (가장 최적).&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,1,1,1,0&quot;&gt;other_node:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;원격(Remote) CPU에서 실행 중인 프로세스가 이 노드의 메모리를 할당받은 횟수.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-path-to-node=&quot;7&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp; (2) 진단 유형별 해결책&lt;/b&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;8&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; ①&lt;span&gt;&amp;nbsp;&lt;/span&gt;numa_miss&lt;span&gt;&amp;nbsp;&lt;/span&gt;비율이 높음 (메모리 부족 문제)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;9&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,0,0&quot;&gt;원인:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;로컬 노드의 메모리가 부족하여 커널이 어쩔 수 없이 타 노드의 메모리를 할당한 경우입니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,1,0&quot;&gt;해결책:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;9,1,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로세스의 메모리 사용량을 줄이거나, 노드 간 메모리 균형을 맞춥니다.&lt;/li&gt;
&lt;li&gt;복수 노드에 메모리를 균등히 분산시켜 할당하는&lt;span&gt;&amp;nbsp;&lt;/span&gt;interleave&lt;span&gt;&amp;nbsp;&lt;/span&gt;정책 적용:&lt;/li&gt;
&lt;li data-ved=&quot;0CAAQhtANahgKEwju9pCIi-iVAxUAAAAAHQAAAAAQ1wE&quot; data-hveid=&quot;0&quot;&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;Bash&lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;pre class=&quot;gams&quot;&gt;&lt;code&gt;$ numactl --interleave=all ./my_application
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-path-to-node=&quot;10&quot; data-ke-size=&quot;size16&quot;&gt;②&lt;span&gt;&amp;nbsp;&lt;/span&gt;other_node&lt;span&gt;&amp;nbsp;&lt;/span&gt;비율이 높음 (CPU affinity 문제)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;11&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11,0,0&quot;&gt;원인:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;메모리는 로컬에 잘 할당되었으나, OS 스케줄러가 프로세스/스레드를&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b data-index-in-node=&quot;42&quot; data-path-to-node=&quot;11,0,0&quot;&gt;타 노드의 CPU로 마이그레이션&lt;/b&gt;하여 실행 중인 경우입니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11,1,0&quot;&gt;해결책:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;11,1,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로세스가 특정 노드의 CPU에서만 실행되도록&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b data-index-in-node=&quot;26&quot; data-path-to-node=&quot;11,1,1,0,0&quot;&gt;CPU Affinity&lt;/b&gt;를 강제 고정합니다:&lt;/li&gt;
&lt;li data-ved=&quot;0CAAQhtANahgKEwju9pCIi-iVAxUAAAAAHQAAAAAQ2AE&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;Bash&lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;pre class=&quot;jboss-cli&quot;&gt;&lt;code&gt;# Node 0의 CPU 및 메모리에 고정
$ numactl --cpunodebind=0 --membind=0 ./my_application

# 또는 taskset으로 CPU 코어 직접 지정
$ taskset -c 0-7 ./my_application
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-path-to-node=&quot;13&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;13&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp; (3). 실무 가이드:&lt;span&gt;&amp;nbsp;&lt;/span&gt;numastat -p &amp;lt;pid&amp;gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;활용&lt;/b&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;14&quot; data-ke-size=&quot;size16&quot;&gt;VM(QEMU/KVM)이나 대용량 DB(PostgreSQL, MySQL) 운용 시, 프로세스 단위의 노드 균형을 체크하는 데 유용합니다.&lt;/p&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwju9pCIi-iVAxUAAAAAHQAAAAAQ2QE&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;&lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;$ numastat -p 12345
Per-node process memory usage (in MBs)
Node 0       Node 1        Total
------       ------        -----
Huge          16384        16384        32768
Heap           1024            4         1028
Stack             2            2            4
Private        2048         2048         4096
-----------------------------------------
Total         19458        18438        37896
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;16&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;16,0,0&quot;&gt;체크 포인트:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;특정 노드로 메모리가 치우쳐 한쪽 노드만 Swap out이 발생하는 현상(&lt;b data-index-in-node=&quot;49&quot; data-path-to-node=&quot;16,0,0&quot;&gt;NUMA imbalance&lt;/b&gt;)을 사전에 감지하고 차단할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; 14.3 &amp;nbsp;&lt;b&gt;메모리&lt;/b&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;b&gt;대역폭&lt;/b&gt;&lt;b&gt;/&lt;/b&gt;&lt;b&gt;지연&lt;/b&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;b&gt;측정&lt;/b&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;b&gt;도구&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1784787345528&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# ============ Intel MLC (Memory Latency Checker) ============
# 노드별 지연 시간과 대역폭 정밀 측정 (Intel 공식 도구)
$ mlc --latency_matrix
Measuring idle latencies (in ns)...
        Numa node
Numa node    0       1
    0      81.2   139.5
    1     139.8    80.9
$ mlc --bandwidth_matrix
Measuring Memory Bandwidths (MB/sec)...
        Numa node
Numa node    0       1
    0    51200   24800    # 리모트 대역폭 ~48% 감소
    1    24600   51100
# 부하 하 지연 (loaded latency) &amp;mdash; 실제 워크로드 시뮬레이션
$ mlc --loaded_latency
Measuring Loaded Latencies...
Inject Delay  Latency   Bandwidth
===========   =======   =========
  00000       215.3     48123     # 최대 부하 시 지연 급증
  00100       105.2     42100
  02000        83.1     12340     # 저부하 시 기본 지연
# ============ STREAM Benchmark ============
# 노드별 메모리 대역폭 측정
$ numactl --cpunodebind=0 --membind=0 ./stream_c.exe
Function    Best Rate MB/s  Avg time     Min time     Max time
Copy:           47231.2     0.013489     0.013472     0.013510
Scale:          47180.5     0.013503     0.013487     0.013525
Add:            52410.8     0.018253     0.018230     0.018280
Triad:          52390.1     0.018260     0.018237     0.018290
# 리모트 노드 대역폭 비교
$ numactl --cpunodebind=0 --membind=1 ./stream_c.exe
# &amp;rarr; Triad가 ~25000 MB/s로 약 50% 감소 (리모트 메모리 접근)
# ============ lmbench ============
# 메모리 지연 프로파일 (stride별)
$ numactl --cpunodebind=0 --membind=0 lat_mem_rd 256m 512
# 배열 크기별 접근 지연 측정
# L1 hit: ~1ns, L2 hit: ~4ns, L3 hit: ~12ns, DRAM: ~80ns
# ============ numactl --hardware (빠른 확인) ============
$ numactl --hardware
# 가장 빠른 NUMA 토폴로지 확인 방법
# 노드 수, CPU 매핑, 메모리 크기, 거리 매트릭스 한 번에 확인&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;리눅스 환경에서 NUMA 성능 저하와 병목을 정밀하게 진단하기 위해 사용하는 업계 표준 벤치마크 도구 3대장(Intel MLC,&lt;/span&gt;&lt;span&gt; STREAM,&lt;/span&gt;&lt;span&gt; lmbench)을 통한 측정 및 핵심 데이터 해석법입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #1f1f1f; text-align: start;&quot; data-path-to-node=&quot;1&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;실제 하드웨어 튜닝 및 성능 분석 시 이 로그들을 어떻게 해석하고 조치해야 하는지 요약해 드립니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #1f1f1f; text-align: start;&quot; data-path-to-node=&quot;3&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp; (1) Intel MLC(Memory Latency Checker): NUMA 레이턴시 &amp;amp; 대역폭의 절대적 기준.&lt;/b&gt;&lt;b&gt;&amp;nbsp;하드웨어의 한계치와 부하 특성 파악&lt;/b&gt;&lt;/p&gt;
&lt;div data-hveid=&quot;3&quot;&gt;
&lt;div style=&quot;background-color: #000000;&quot;&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;# 1) --latency_matrix &amp;amp; --bandwidth_matrix
Local (0&amp;rarr;0): 81.2 ns / 51,200 MB/s
Remote (0&amp;rarr;1): 139.5 ns / 24,800 MB/s  (지연 ~72% 증가, 대역폭 ~51% 감소)
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc; color: #1f1f1f; text-align: start;&quot; data-path-to-node=&quot;5&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,0,0&quot;&gt;하드웨어 제약 확인:&lt;/b&gt;&lt;span&gt; UPI/Infinity Fabric 같은 노드 간 인터커넥트 버스의 대역폭 한계로 인해,&lt;/span&gt;&lt;span&gt; 리모트 노드 접근 시 &lt;/span&gt;&lt;b data-index-in-node=&quot;74&quot; data-path-to-node=&quot;5,0,0&quot;&gt;지연 시간은 약 1.7배 늘어나고 대역폭은 반토막&lt;/b&gt;&lt;span&gt;이 납니다.&lt;/span&gt;&lt;span&gt; 애플리케이션 아키텍처 설계 시 리모트 메모리 접근을 반드시 회피해야 하는 정량적 근거가 됩니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6,2,0&quot;&gt;분석:&lt;/b&gt;&lt;span&gt; 앞서 &lt;/span&gt;numactl --hardware&lt;span&gt;에서 보았던 거리 비율(&lt;/span&gt;10 : 21&lt;span&gt;)이 실제 시스템에서 &lt;/span&gt;&lt;b data-index-in-node=&quot;57&quot; data-path-to-node=&quot;6,2,0&quot;&gt;레이턴시 약 72% 증가&lt;/b&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;b data-index-in-node=&quot;72&quot; data-path-to-node=&quot;6,2,0&quot;&gt;대역폭 약 51.5% 감쇄&lt;/b&gt;&lt;span&gt;로 명확히 드러납니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div data-hveid=&quot;6&quot;&gt;
&lt;div style=&quot;background-color: #000000;&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;# 2) --loaded_latency (Inject Delay에 따른 변화)
최대 부하 (00000): 215.3 ns / 48,123 MB/s
저부하 (02000):  83.1 ns / 12,340 MB/s
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc; color: #1f1f1f; text-align: start;&quot; data-path-to-node=&quot;7&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,0,0&quot;&gt;Loaded Latency의 위험성:&lt;/b&gt;&lt;span&gt; 평상시 지연(Idle Latency)이 80ns인 시스템이라도,&lt;/span&gt;&lt;span&gt; 메모리 버스에 트래픽이 몰려 포화 상태(Saturation Point)에 도달하면 지연 시간이 &lt;/span&gt;&lt;b data-index-in-node=&quot;110&quot; data-path-to-node=&quot;7,0,0&quot;&gt;215.3ns로 2.5배 이상 급증&lt;/b&gt;&lt;span&gt;합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,1,0&quot;&gt;실무 적용:&lt;/b&gt;&lt;span&gt; 메모리 집약적인 워크로드가 대역폭 한계(여기서는 약 48GB/s)에 아슬아슬하게 걸쳐 동작할 때 대기 시간이 폭발적으로 늘어나는 병목 현상을 예측할 수 있습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;8,1,0&quot;&gt;실무적 시사점:&lt;/b&gt;&lt;span&gt; 단순히 &quot;Remote 메모리를 안 쓰면 된다&quot;를 넘어,&lt;/span&gt;&lt;span&gt; Local 메모리라 할지라도 &lt;/span&gt;&lt;b data-index-in-node=&quot;56&quot; data-path-to-node=&quot;8,1,0&quot;&gt;메모리 버스 대역폭 상한선(Saturate)에 도달하면 Remote 접근보다 더 큰 지연&lt;/b&gt;&lt;span&gt;이 발생할 수 있음을 보여줍니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #1f1f1f; text-align: start;&quot; data-path-to-node=&quot;9&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #1f1f1f; text-align: start;&quot; data-path-to-node=&quot;9&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp; (2) STREAM Benchmark: 실제 연산 패턴별 대역폭 검증&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #1f1f1f; text-align: start;&quot; data-path-to-node=&quot;10&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;리눅스 커널 수준의 NUMA 바인딩(&lt;/span&gt;numactl&lt;span&gt;)이 메모리 하위 시스템에서 실제 컴파일된 C 코드에 어떻게 투영되는지 보여줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #1f1f1f; text-align: start;&quot; data-path-to-node=&quot;10&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;color: #000000;&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11,0,0&quot;&gt;Local Access (Node 0&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span data-index-in-node=&quot;21&quot; data-math=&quot;\rightarrow&quot;&gt;$\rightarrow$&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;0):&lt;/b&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Triad 기준&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;52,390 MB/s&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;(MLC 이론 대역폭의 약 98% 수용)&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;color: #000000;&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11,1,0&quot;&gt;Remote Access (Node 0&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span data-index-in-node=&quot;22&quot; data-math=&quot;\rightarrow&quot;&gt;$\rightarrow$&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;1):&lt;/b&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Triad 기준&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;~25,000 MB/s&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;(&lt;/span&gt;&lt;b data-index-in-node=&quot;61&quot; data-path-to-node=&quot;11,1,0&quot;&gt;52% 감소&lt;/b&gt;&lt;span&gt;)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #1f1f1f; text-align: start;&quot; data-path-to-node=&quot;11&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11,0,0&quot;&gt;4개 프리미티브 패턴:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;11,0,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11,0,1,0,0&quot;&gt;Copy (c = a):&lt;/b&gt;&lt;span&gt; 순수 읽기/쓰기 대역폭. 단순 메모리 복사&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11,0,1,1,0&quot;&gt;Scale (c = q * a):&lt;/b&gt;&lt;span&gt; 레지스터 연산이 포함된 대역폭. 상수 곱셈 후 저장&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11,0,1,2,0&quot;&gt;Add (c = a + b):&lt;/b&gt;&lt;span&gt; 두 개의 벡터를 읽어와 하나에 쓰는 패턴. 두 벡의 합 산출&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11,0,1,3,0&quot;&gt;Triad (a = b + q * c):&lt;/b&gt;&lt;span&gt; 현업에서 가장 신뢰하는 수치로,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;b data-index-in-node=&quot;41&quot; data-path-to-node=&quot;11,0,1,3,0&quot;&gt;HPC/FDM/Matrix 연산의 실제 대역폭&lt;/b&gt;&lt;span&gt;을 대변합니다. &lt;span style=&quot;color: #1f1f1f; text-align: left;&quot;&gt;FMA(Fused Multiply-Add) 구조로 &lt;/span&gt;&lt;b data-index-in-node=&quot;56&quot; data-path-to-node=&quot;13,3,0&quot;&gt;실제 HPC/AI 워크로드 메모리 패턴과 가장 유사&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11,1,0&quot;&gt;검증:&lt;/b&gt;&lt;span&gt; &lt;/span&gt;membind=1&lt;span&gt;로 원격 노드를 찔렀을 때 Triad 결과가 딱 인터커넥트 한계치(~25,&lt;/span&gt;&lt;span&gt;000 MB/s)로 수렴하는 것을 통해,&lt;/span&gt;&lt;span&gt; 커널 정책이 하드웨어 수준에서 정확히 강제되고 있음을 교차 검증할 수 있습니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #1f1f1f; text-align: start;&quot; data-path-to-node=&quot;13&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp; (3) lmbench (lat_mem_rd): 캐시 계층 구조 시각화&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #1f1f1f; text-align: start;&quot; data-path-to-node=&quot;13&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #1f1f1f; text-align: start;&quot;&gt;메모리 스트라이드(Stride) 접근을 통해 CPU 캐시 hierarchy부터 DRAM,&lt;/span&gt;&lt;span style=&quot;color: #1f1f1f; text-align: start;&quot;&gt; Remote DRAM까지의 지연 시간을 한눈에 보여줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;div data-hveid=&quot;9&quot;&gt;
&lt;div style=&quot;background-color: #000000;&quot;&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;L1 (~1ns) &amp;rarr; L2 (~4ns) &amp;rarr; L3 (~12ns) &amp;rarr; Local DRAM (~80ns) &amp;rarr; Remote DRAM (~140ns)
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc; color: #1f1f1f; text-align: start;&quot; data-path-to-node=&quot;15&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;15,0,0&quot;&gt;Stride(보폭)의 마법:&lt;/b&gt;&lt;span&gt; &lt;/span&gt;lat_mem_rd&lt;span&gt;는 배열 크기를 점진적으로 늘려가며 스트라이드(예:&lt;/span&gt;&lt;span&gt; 512바이트씩 건너뛰기) 접근을 수행합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;15,1,0&quot;&gt;데이터 포인터 확인:&lt;/b&gt;&lt;span&gt; 결과 데이터를 그래프로 그리면 캐시 크기 경계면(예:&lt;/span&gt;&lt;span&gt; 32KB,&lt;/span&gt;&lt;span&gt; 256KB,&lt;/span&gt;&lt;span&gt; 30MB)에서 지연 시간이 계단식으로 툭툭 튀는 지점이 발생합니다.&lt;/span&gt;&lt;span&gt; 이를 통해 하드웨어의 캐시 적중률(Cache Hit Rate) 한계선을 파악하고,&lt;/span&gt;&lt;span&gt; 알고리즘의 Data Locality(데이터 지역성)를 하드웨어 캐시 크기에 맞게 최적화(Cache Blocking 기법 등)할 수 있습니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;table style=&quot;color: #000000; text-align: start; border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-path-to-node=&quot;17&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style13&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;접근 계층&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;레이턴시 (approx.)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;비고&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;17,1,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;17,1,0,0&quot;&gt;L1d Cache&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;17,1,1,0&quot;&gt;~1.0 ns&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;17,1,2,0&quot;&gt;Core 내부&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;17,2,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;17,2,0,0&quot;&gt;L2 Cache&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;17,2,1,0&quot;&gt;~4.0 ns&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;17,2,2,0&quot;&gt;Core 내부 / Dedicated&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;17,3,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;17,3,0,0&quot;&gt;L3 Cache (LLC)&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;17,3,1,0&quot;&gt;~12.0 ns&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;17,3,2,0&quot;&gt;Package 공유&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;17,4,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;17,4,0,0&quot;&gt;Local DRAM&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;17,4,1,0&quot;&gt;~80.0 ns&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;17,4,2,0&quot;&gt;Local Memory Controller&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;17,5,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;17,5,0,0&quot;&gt;Remote DRAM&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;17,5,1,0&quot;&gt;~140.0 ns&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;17,5,2,0&quot;&gt;Interconnect (UPI/IF) 경유&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #1f1f1f; text-align: start;&quot; data-path-to-node=&quot;17&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;  종합 결론 및 워크플로우&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal; color: #1f1f1f; text-align: start;&quot; data-path-to-node=&quot;18&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span&gt;시스템 도입 초기 혹은 커널 업데이트 시 &lt;/span&gt;numactl --hardware&lt;span&gt;로 빠르게 구조를 스캔합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;Intel MLC&lt;span&gt;를 돌려 이 시스템의 최대 성능 한계선(대역폭 임계점,&lt;/span&gt;&lt;span&gt; 리모트 페널티)을 산출합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;애플리케이션 개발 시 &lt;/span&gt;&lt;b data-index-in-node=&quot;12&quot; data-path-to-node=&quot;18,2,0&quot;&gt;lmbench&lt;/b&gt;&lt;span&gt; 결과를 토대로 자료구조 크기를 캐시 라인 및 L2/L3 크기에 맞춥니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;마지막으로 &lt;/span&gt;STREAM&lt;span&gt;을 통해 &lt;/span&gt;numactl&lt;span&gt; 바인딩 정책이 최적의 실측 성능을 내는지 최종 검증합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #1f1f1f; text-align: start;&quot; data-path-to-node=&quot;19&quot; data-ke-size=&quot;size16&quot;&gt; &lt;b&gt; 정리: NUMA 최적화 골든 루틴 (Workflow)&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1784787977271&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[1. 탐색] numactl --hardware / lstopo
   └── 노드별 CPU, 메모리 배치 및 SLIT 거리 확인

[2. 검증] Intel MLC / STREAM
   └── 시스템의 Local vs Remote 성능 한계치(Baseline) 수치화

[3. 모니터링] numastat / perf stat
   └── 애플리케이션 실행 중 Remote Access / Miss 비율 감지

[4. 정밀 진단] perf c2c / perf record
   └── Cache Line 단위의 False Sharing 및 핫스팟 함수 추적

[5. 튜닝] numactl / Taskset / alignas(64)
   └── 프로세스 바인딩, 메모리 인터리빙, 구조체 패딩 적용&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;Intel MLC&amp;nbsp;&lt;/b&gt;&lt;b&gt;설치&lt;/b&gt;&lt;b&gt;:&lt;/b&gt;&amp;nbsp;Intel MLC는&amp;nbsp;&lt;a style=&quot;color: #333333;&quot; href=&quot;https://www.intel.com/content/www/us/en/developer/articles/tool/intelr-memory-latency-checker.html&quot;&gt;https://www.intel.com/content/www/us/en/developer/articles/tool/intelr-memory-latency-checker.html&lt;/a&gt;에서&amp;nbsp;무료로다운로드할&amp;nbsp;수&amp;nbsp;있습니다. AMD&amp;nbsp;시스템에서도&amp;nbsp;대부분&amp;nbsp;동작하지만, AMD&amp;nbsp;전용으로는&amp;nbsp;AMD uProf의&amp;nbsp;메모리프로파일링(Profiling)&amp;nbsp;기능을&amp;nbsp;사용할&amp;nbsp;수&amp;nbsp;있습니다. STREAM은&amp;nbsp;&lt;a style=&quot;color: #333333;&quot; href=&quot;https://www.cs.virginia.edu/stream/&quot;&gt;https://www.cs.virginia.edu/stream/&lt;/a&gt;에서&amp;nbsp;소스를받아&amp;nbsp;gcc -O3 -fopenmp -DSTREAM_ARRAY_SIZE=...으로&amp;nbsp;컴파일합니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #0b57d0; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;분산&amp;nbsp;및&amp;nbsp;클라우드&amp;nbsp;컴퓨팅&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; 14.4 &amp;nbsp;&lt;b&gt;최적화&lt;/b&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;b&gt;패턴&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;color: #000000; text-align: start; border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; width=&quot;763&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style13&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;문제&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;진단&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;해결&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;높은 리모트 접근 비율&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;numastat의&amp;nbsp;numa_miss&amp;nbsp;비율 확인&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;numactl --membind&amp;nbsp;또는&amp;nbsp;--cpunodebind&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;NIC IRQ가 리모트 노드CPU에서 처리&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;cat /proc/irq/*/smp_affinity&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;IRQ를&amp;nbsp;NIC&amp;nbsp;로컬 노드&amp;nbsp;CPU에 바인딩&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;대형 해시 테이블의 불균일 접근&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;perf c2c&amp;nbsp;분석&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;numactl --interleave=all&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;NUMA balancing&amp;nbsp;오버헤드&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;/proc/vmstat의&amp;nbsp;numa_hint_faults&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;sysctl kernel.numa_balancing=0&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;한쪽 노드만&amp;nbsp;OOM&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;/sys/.../node*/meminfo&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;메모리 정책 조정,&amp;nbsp;vm.zone_reclaim_mode&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;KVM&amp;nbsp;게스트 성능 저하&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;vCPU가 다른 물리 노드로 이동&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;vNUMA&amp;nbsp;설정&amp;nbsp;+ CPU/memory&amp;nbsp;핀닝&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;CXL&amp;nbsp;메모리 활용 부족&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;numastat에서&amp;nbsp;CXL&amp;nbsp;노드 미사용&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;MPOL_WEIGHTED_INTERLEAVE&amp;nbsp;정책&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;border-left: #0B2161 10px solid; padding-right: 10px; border-bottom: #0B2161 2px solid; pading-bottom: px; padding-top: 0px; margin: 10px 0px 5px; line-height: 30px;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;b&gt;15. &amp;nbsp;커널 설정 종합&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1784788088538&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# ===== NUMA 관련 커널 설정 종합 =====
# -- 기본 NUMA 지원 --
CONFIG_NUMA=y
CONFIG_AMD_NUMA=y                  # AMD NUMA (K8 이상)
CONFIG_X86_64_ACPI_NUMA=y          # ACPI SRAT 기반 NUMA
CONFIG_ACPI_NUMA=y
CONFIG_NODES_SHIFT=10              # 최대 NUMA 노드 수 (2^10 = 1024)
# -- NUMA Balancing --
CONFIG_NUMA_BALANCING=y             # Automatic NUMA Balancing
CONFIG_NUMA_BALANCING_DEFAULT_ENABLED=y
# -- 메모리 정책 --
CONFIG_MIGRATION=y                  # 페이지 마이그레이션 지원
# -- 메모리 티어링 (CXL 등) --
CONFIG_MEMORY_TIER=y                # 메모리 티어링 프레임워크
CONFIG_DEMOTION=y                   # 콜드 페이지 디모션
# -- CXL 지원 --
CONFIG_CXL_BUS=y
CONFIG_CXL_MEM=y
CONFIG_CXL_ACPI=y
CONFIG_CXL_REGION=y
# -- HMAT (이종 메모리 속성) --
CONFIG_ACPI_HMAT=y                  # HMAT 파싱
# -- 디버깅/통계 --
CONFIG_NUMA_EMU=y                   # NUMA 에뮬레이션 (UMA에서 테스트)
CONFIG_SCHED_DEBUG=y                # 스케줄링 도메인 디버깅
CONFIG_VMSTAT=y                     # /proc/vmstat NUMA 통계&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;NUMA&amp;nbsp;에뮬레이션&lt;/span&gt;:&lt;/b&gt;&amp;nbsp;단일&amp;nbsp;소켓(UMA)&amp;nbsp;시스템에서&amp;nbsp;NUMA&amp;nbsp;관련&amp;nbsp;코드를&amp;nbsp;테스트하려면&amp;nbsp;커널커맨드라인에&amp;nbsp;&lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;numa=fake=4&lt;/b&gt;&lt;/span&gt;를&amp;nbsp;추가하여&amp;nbsp;가상의&amp;nbsp;4-노드&amp;nbsp;NUMA&amp;nbsp;시스템을&amp;nbsp;에뮬레이션할&amp;nbsp;수있습니다.&amp;nbsp;&lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;CONFIG_NUMA_EMU=y&lt;/b&gt;&lt;/span&gt;가&amp;nbsp;필요합니다.&amp;nbsp;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #0b57d0; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;컴퓨터&amp;nbsp;메모리&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;border-left: #0B2161 10px solid; padding-right: 10px; border-bottom: #0B2161 2px solid; pading-bottom: px; padding-top: 0px; margin: 10px 0px 5px; line-height: 30px;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;b&gt;15. &amp;nbsp;트러블 슈팅&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; 15.1 &amp;nbsp;일반적인 문제와 해결&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;color: #000000; text-align: start; border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; width=&quot;763&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style13&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;증상&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;원인&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;진단&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;해결&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;한쪽 노드만&amp;nbsp;OOM&amp;nbsp;발생&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;MPOL_BIND로 특정 노드에 바인딩된 프로세스&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;/proc/PID/numa_maps&amp;nbsp;확인&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;MPOL_PREFERRED로 변경 또는 메모리 증설&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;성능 저하&amp;nbsp;(latency&amp;nbsp;증가)&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;리모트&amp;nbsp;NUMA&amp;nbsp;접근 비율 높음&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;perf stat -e node-load-misses&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;numactl --cpunodebind --membind&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;NUMA balancing&amp;nbsp;&lt;a style=&quot;color: #333333;&quot; href=&quot;https://www.minzkn.com/linuxkernel/pages/numa.html&quot;&gt;&amp;nbsp;CPU&lt;/a&gt;&amp;nbsp;오버헤드&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;잦은&amp;nbsp;NUMA hint fault&amp;nbsp;발생&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;perf top에서&amp;nbsp;do_numa_page&amp;nbsp;비율&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;kernel.numa_balancing=0&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;kswapd&amp;nbsp;과도한 활동(한쪽 노드)&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;노드 간 메모리 불균형&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;/proc/zoneinfo&amp;nbsp;워터마크(Watermark)&amp;nbsp;확인&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;vm.zone_reclaim_mode&amp;nbsp;조정&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;DB&amp;nbsp;쿼리 성능 불일정&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;NUMA balancing이 페이지 이동(Page Migration)&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;/proc/vmstat numa_pages_migrated&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;DB&amp;nbsp;프로세스에&amp;nbsp;membind적용&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;멀티스레드 앱 확장성 저하&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;스레드 간&amp;nbsp;false sharing + cross-node&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;perf c2c&amp;nbsp;분석&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;a style=&quot;color: #333333;&quot; href=&quot;https://www.minzkn.com/linuxkernel/pages/numa.html&quot;&gt;&amp;nbsp;데이터&lt;/a&gt;&amp;nbsp;구조&amp;nbsp;padding,&amp;nbsp;노드별 분리&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; 15.2 &amp;nbsp;&lt;b&gt;디버깅&lt;/b&gt;&lt;b&gt;(Debugging)&amp;nbsp;&lt;/b&gt;&lt;b&gt;명령&lt;/b&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;b&gt;모음&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1784788234406&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# ============ 토폴로지 확인 ============
$ numactl --hardware                  # NUMA 토폴로지 전체
$ lscpu | grep -i numa                # CPU-NUMA 매핑 요약
$ lstopo --of txt                     # hwloc 상세 토폴로지
# ============ 메모리 분포 ============
$ numastat                            # 시스템 전체 NUMA 통계
$ numastat -p &amp;lt;pid&amp;gt;                   # 프로세스별 NUMA 메모리
$ cat /proc/&amp;lt;pid&amp;gt;/numa_maps           # VMA별 노드 분포
$ cat /sys/devices/system/node/node*/meminfo  # 노드별 상세 메모리
# ============ 성능 카운터 ============
$ perf stat -e node-loads,node-load-misses ./app  # NUMA 미스 측정
$ perf c2c record -- ./app            # false sharing 분석
# ============ 밸런싱 통계 ============
$ cat /proc/vmstat | grep numa        # NUMA balancing 통계
$ cat /proc/&amp;lt;pid&amp;gt;/sched | grep numa   # 프로세스 NUMA 폴트
# ============ 커널 로그 ============
$ dmesg | grep -iE &quot;numa|srat|slit|node&quot;  # NUMA 초기화 로그
# ============ 장치 NUMA 친화성 ============
$ cat /sys/class/net/*/device/numa_node     # NIC NUMA 노드
$ cat /sys/block/*/device/numa_node         # 블록 장치 NUMA 노드
$ lspci -vvv | grep -i &quot;NUMA node&quot;         # PCIe 장치 NUMA 노드&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;border-left: #0B2161 10px solid; padding-right: 10px; border-bottom: #0B2161 2px solid; pading-bottom: px; padding-top: 0px; margin: 10px 0px 5px; line-height: 30px;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;b&gt;16. &amp;nbsp;흔한 실수와 안티패턴&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;NUMA&amp;nbsp;환경에서&amp;nbsp;자주&amp;nbsp;발생하는&amp;nbsp;성능&amp;nbsp;문제와&amp;nbsp;설정&amp;nbsp;실수를&amp;nbsp;정리합니다.&amp;nbsp;대부분&amp;nbsp;NUMA&amp;nbsp;토폴로지를&amp;nbsp;무시하거나잘못&amp;nbsp;이해한&amp;nbsp;상태에서&amp;nbsp;발생합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #0b57d0; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;운영체제&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;color: #000000; text-align: start; border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; width=&quot;763&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style13&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;실수&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;증상&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;원인&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;해결&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;malloc&amp;nbsp;&lt;/b&gt;&lt;b&gt;후 첫 접근 전&amp;nbsp;fork()&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;자식 프로세스의 메모리가 부모와 같은 노드에 고정&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;CoW(Copy-on-Write)&amp;nbsp;페이지가 부모 노드에 할당됨&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;fork()&amp;nbsp;후 자식에서&amp;nbsp;set_mempolicy()호출,&amp;nbsp;또는&amp;nbsp;MADV_HUGEPAGE&amp;nbsp;+ NUMA balancing&amp;nbsp;활용&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;모든 것에membind&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;한쪽 노드만&amp;nbsp;OOM,&amp;nbsp;다른 노드는 여유&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;과도한&amp;nbsp;MPOL_BIND로 노드 간 메모리 활용 불균형&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;대부분의 경우&amp;nbsp;MPOL_PREFERRED&amp;nbsp;또는 기본 정책이 더 나음&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;interleave&lt;/b&gt;&lt;b&gt;를 모든 워크로드에 적용&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;지연 민감 워크로드 성능 저하&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;interleave는 절반의 접근이 리모트 노드&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;interleave는 대역폭 위주(해시 테이블,&amp;nbsp;대형 배열)에만 사용,&amp;nbsp;지연 민감 워크로드는bind/preferred&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;NIC IRQ&lt;/b&gt;&lt;b&gt;가 잘못된 노드에 배치&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;네트워크 처리량(Throughput)저하, CPU&amp;nbsp;사용률 증가&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;irqbalance가&amp;nbsp;IRQ를NIC&amp;nbsp;리모트 노드로 이동&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;수동&amp;nbsp;IRQ&amp;nbsp;바인딩 또는&amp;nbsp;irqbalance&amp;nbsp;힌트 설정,&amp;nbsp;set_irq_affinity.sh&amp;nbsp;스크립트 사용&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;vNUMA&amp;nbsp;&lt;/b&gt;&lt;b&gt;없는 대형&amp;nbsp;VM&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;VM&amp;nbsp;내부 성능 불일정,&amp;nbsp;예측 불가능한 지연&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;게스트&amp;nbsp;OS가NUMA를 인식하지 못하여 최적화 불가&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;vNUMA&amp;nbsp;설정&amp;nbsp;+&amp;nbsp;호스트&amp;nbsp;NUMA&amp;nbsp;노드에vCPU/memory&amp;nbsp;핀닝&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;NUMA balancing +&amp;nbsp;&lt;/b&gt;&lt;b&gt;명시적 바인딩 충돌&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;balancing이 바인딩을 무시하고 페이지 이동&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;커널&amp;nbsp;NUMA balancing과 사용자 정책이 경쟁&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;명시적&amp;nbsp;membind&amp;nbsp;사용 시&amp;nbsp;kernel.numa_balancing=0&amp;nbsp;고려&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;1GB HugePage&lt;/b&gt;&lt;b&gt;의NUMA&amp;nbsp;배치 무시&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;hugepage가 리모트 노드에 할당,&amp;nbsp;마이그레이션 불가&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;1GB hugepage는 부팅 시 할당되어 마이그레이션 불가능&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;노드별로&amp;nbsp;/sys/.../hugepages-1048576kB/nr_hugepages&amp;nbsp;개별 설정&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;DB&amp;nbsp;&lt;/b&gt;&lt;b&gt;공유 버퍼(Buffer)를MPOL_BIND로 단일 노드에 고정&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;해당 노드&amp;nbsp;OOM,&amp;nbsp;또는 리모트CPU에서 접근 시 느림&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;대형 공유 버퍼가 한 노드의 대부분을 소비&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;MPOL_INTERLEAVE로 분산하거나,&amp;nbsp;노드별&amp;nbsp;DB&amp;nbsp;인스턴스(Instance)&amp;nbsp;분리&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; 16.1&amp;nbsp; &lt;b&gt;코드&lt;/b&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;b&gt;레벨&lt;/b&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;b&gt;안티패턴&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1784788326103&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/* ❌ 안티패턴 1: NUMA 무시 대량 할당 */
void *buf = malloc(1UL &amp;lt;&amp;lt; 30);  /* 1GB 할당 */
memset(buf, 0, 1UL &amp;lt;&amp;lt; 30);   /* 현재 CPU의 노드에 전부 할당됨 */
/* 다른 노드의 스레드가 접근하면 모두 리모트 접근 */
/* ✅ 개선: 스레드별 첫 접근으로 분산 (first-touch) */
void *buf = mmap(NULL, size, PROT_READ|PROT_WRITE,
                MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
/* 각 스레드가 자기 영역만 초기화 &amp;rarr; 해당 스레드의 로컬 노드에 할당 */
#pragma omp parallel for
for (int i = 0; i &amp;lt; num_threads; i++) {
    memset(buf + i * chunk_size, 0, chunk_size);
}
/* ❌ 안티패턴 2: 커널에서 NUMA 무시 할당 */
ptr = kmalloc(size, GFP_KERNEL);  /* 현재 CPU 노드에 할당 */
/* 이 메모리를 다른 노드의 장치 IRQ 핸들러에서 접근 */
/* ✅ 개선: 장치 노드에서 할당 */
ptr = kmalloc_node(size, GFP_KERNEL, dev_to_node(dev));
/* ❌ 안티패턴 3: per-CPU 데이터를 다른 CPU에서 빈번히 접근 */
/* per-CPU는 해당 CPU 노드의 메모리이므로
 * 다른 CPU에서 접근 시 리모트 + 캐시 바운싱 */
total += per_cpu(counter, other_cpu);  /* 느림! */
/* ✅ 개선: 합산이 필요하면 for_each_possible_cpu + 로컬 합산 */
for_each_possible_cpu(cpu)
    total += per_cpu(counter, cpu);  /* 전체 순회는 드물게만 */&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;First-Touch&amp;nbsp;정책&lt;/span&gt;:&lt;/b&gt;&amp;nbsp;Linux의&amp;nbsp;기본&amp;nbsp;메모리&amp;nbsp;정책(&lt;b&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;MPOL_DEFAULT&lt;/span&gt;&lt;/b&gt;)은&amp;nbsp;first-touch입니다.&amp;nbsp;즉,&amp;nbsp;페이지는&amp;nbsp;처음접근(touch)하는&amp;nbsp;CPU의&amp;nbsp;NUMA&amp;nbsp;노드에&amp;nbsp;할당됩니다.&amp;nbsp;따라서&amp;nbsp;대형&amp;nbsp;배열을&amp;nbsp;한&amp;nbsp;스레드에서&amp;nbsp;초기화한&amp;nbsp;후&amp;nbsp;여러스레드에서&amp;nbsp;접근하면,&amp;nbsp;모든&amp;nbsp;메모리가&amp;nbsp;초기화&amp;nbsp;스레드의&amp;nbsp;노드에&amp;nbsp;집중됩니다.&amp;nbsp;멀티스레드&amp;nbsp;초기화(parallel first-touch)&amp;nbsp;또는&amp;nbsp;&lt;b&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;MPOL_INTERLEAVE&lt;/span&gt;&lt;/b&gt;로&amp;nbsp;분산하는&amp;nbsp;것이&amp;nbsp;핵심&amp;nbsp;패턴입니다.&amp;nbsp;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #0b57d0; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;분산&amp;nbsp;및&amp;nbsp;클라우드&amp;nbsp;컴퓨팅&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;border-left: #0B2161 10px solid; padding-right: 10px; border-bottom: #0B2161 2px solid; pading-bottom: px; padding-top: 0px; margin: 10px 0px 5px; line-height: 30px;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;b&gt;17. &amp;nbsp;NUMA 초기화 흐름&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;커널&amp;nbsp;부팅&amp;nbsp;시&amp;nbsp;NUMA&amp;nbsp;토폴로지&amp;nbsp;초기화는&amp;nbsp;여러&amp;nbsp;단계를&amp;nbsp;거칩니다. ACPI&amp;nbsp;테이블&amp;nbsp;파싱부터&amp;nbsp;pglist_data&amp;nbsp;구성, zonelist&amp;nbsp;빌드, kswapd&amp;nbsp;기동까지의&amp;nbsp;전체&amp;nbsp;흐름을&amp;nbsp;살펴봅니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-07-23 오후 3.33.41.png&quot; data-origin-width=&quot;1494&quot; data-origin-height=&quot;742&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bZWraQ/dJMcahLZwdW/NbaFnqgUxnyAn5uuVW78B0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bZWraQ/dJMcahLZwdW/NbaFnqgUxnyAn5uuVW78B0/img.png&quot; data-alt=&quot;NUMA&amp;amp;nbsp; 초기화 &amp;amp;nbsp; 전체 &amp;amp;nbsp; 흐름 &amp;amp;nbsp;&amp;amp;mdash;&amp;amp;nbsp; 펌웨어 (Firmware) ACPI&amp;amp;nbsp; 테이블 &amp;amp;nbsp;&amp;amp;rarr;&amp;amp;nbsp; 커널 &amp;amp;nbsp; 파싱 &amp;amp;nbsp;&amp;amp;rarr;&amp;amp;nbsp; 자료구조 &amp;amp;nbsp; 구성 &amp;amp;nbsp;&amp;amp;rarr;&amp;amp;nbsp; 런타임 &amp;amp;nbsp; 관리&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bZWraQ/dJMcahLZwdW/NbaFnqgUxnyAn5uuVW78B0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbZWraQ%2FdJMcahLZwdW%2FNbaFnqgUxnyAn5uuVW78B0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1494&quot; height=&quot;742&quot; data-filename=&quot;스크린샷 2026-07-23 오후 3.33.41.png&quot; data-origin-width=&quot;1494&quot; data-origin-height=&quot;742&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;NUMA&amp;nbsp; 초기화 &amp;nbsp; 전체 &amp;nbsp; 흐름 &amp;nbsp;&amp;mdash;&amp;nbsp; 펌웨어 (Firmware) ACPI&amp;nbsp; 테이블 &amp;nbsp;&amp;rarr;&amp;nbsp; 커널 &amp;nbsp; 파싱 &amp;nbsp;&amp;rarr;&amp;nbsp; 자료구조 &amp;nbsp; 구성 &amp;nbsp;&amp;rarr;&amp;nbsp; 런타임 &amp;nbsp; 관리&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #0b57d0; color: #000000; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;i&gt;컴퓨터&lt;/i&gt;&lt;i&gt;&amp;nbsp;&lt;/i&gt;&lt;i&gt;메모리&lt;/i&gt;&lt;i&gt;&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1784788480556&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/*
 * NUMA 초기화 흐름 (x86_64 기준)
 *
 * start_kernel()
 *   &amp;rarr; setup_arch()
 *       &amp;rarr; acpi_boot_init()
 *       &amp;rarr; acpi_numa_init()            &amp;larr; SRAT/SLIT 파싱
 *           &amp;rarr; acpi_parse_srat()
 *               &amp;rarr; acpi_parse_processor_affinity()  &amp;larr; CPU&amp;rarr;Node
 *               &amp;rarr; acpi_parse_memory_affinity()     &amp;larr; Memory&amp;rarr;Node
 *           &amp;rarr; acpi_parse_slit()
 *               &amp;rarr; acpi_numa_slit_init()            &amp;larr; 거리 매트릭스
 *       &amp;rarr; numa_init()
 *           &amp;rarr; numa_register_memblks()  &amp;larr; 노드별 메모리 범위 등록
 *           &amp;rarr; init_cpu_to_node()       &amp;larr; CPU&amp;rarr;Node 매핑 확정
 *   &amp;rarr; mm_core_init()
 *       &amp;rarr; build_all_zonelists()       &amp;larr; zonelist 구성 (SLIT 거리 순)
 *       &amp;rarr; free_area_init()            &amp;larr; pg_data_t, zone 초기화
 *   &amp;rarr; rest_init()
 *       &amp;rarr; kernel_init()
 *           &amp;rarr; smp_init()
 *               &amp;rarr; sched_init_domains()  &amp;larr; NUMA sched_domain 구성
 *           &amp;rarr; kswapd_init()           &amp;larr; 노드별 kswapd 기동
 */
/* arch/x86/mm/numa.c &amp;mdash; NUMA 초기화 진입점 */
static int __init numa_init(int (*init_func)(void))
{
    int ret;
    /* 노드/CPU 데이터 초기화 */
    nodes_clear(numa_nodes_parsed);
    memset(&amp;amp;numa_meminfo, 0, sizeof(numa_meminfo));
    numa_reset_distance();
    /* ACPI SRAT/SLIT 파싱 (또는 AMD K8, devicetree 등) */
    ret = init_func();
    if (ret &amp;lt; 0)
        return ret;
    /* 파싱된 노드 정보로 memblock 등록 */
    ret = numa_register_memblks(&amp;amp;numa_meminfo);
    if (ret &amp;lt; 0)
        return ret;
    /* CPU&amp;rarr;Node 매핑 확정 */
    for (i = 0; i &amp;lt; nr_cpu_ids; i++)
        set_cpu_numa_node(i, early_cpu_to_node(i));
    /* numa_distance[][] 유효성 검증 */
    numa_add_cpu(0);
    return 0;
}
/* mm/page_alloc.c &amp;mdash; zonelist 구성 */
static void build_zonelists(pg_data_t *pgdat)
{
    struct zoneref *zonerefs;
    int node, local_node = pgdat-&amp;gt;node_id;
    /*
     * 로컬 노드 우선, SLIT 거리 순으로 zonelist 구성
     * find_next_best_node()가 거리가 가까운 순서로 노드 반환
     */
    zonerefs = pgdat-&amp;gt;node_zonelists[ZONELIST_FALLBACK]._zonerefs;
    /* 로컬 노드의 존들을 먼저 추가 */
    build_zonerefs_node(pgdat, zonerefs);
    /* 거리 순으로 리모트 노드 추가 */
    while ((node = find_next_best_node(local_node, &amp;amp;used_mask))
           &amp;gt;= 0) {
        build_zonerefs_node(NODE_DATA(node), zonerefs);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;부팅&amp;nbsp;로그&amp;nbsp;확인&lt;/span&gt;:&lt;/b&gt;&amp;nbsp;&lt;b&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;dmesg | grep -iE &quot;numa|srat|slit|node|zone&quot;&lt;/span&gt;&lt;/b&gt;로&amp;nbsp;NUMA&amp;nbsp;초기화&amp;nbsp;과정을&amp;nbsp;확인할&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;특히&amp;nbsp;&lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;&quot;SRAT: Node N PXM M&quot;&lt;/b&gt;&lt;/span&gt;&amp;nbsp;메시지로&amp;nbsp;ACPI에서&amp;nbsp;파싱된&amp;nbsp;노드&amp;nbsp;매핑(Mapping)을,&amp;nbsp;&lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;&quot;Initmem setup node N&quot;&lt;/b&gt;&lt;/span&gt;으로&amp;nbsp;노드별&amp;nbsp;메모리범위를&amp;nbsp;확인합니다.&amp;nbsp;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #0b57d0; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;분산&amp;nbsp;및&amp;nbsp;클라우드&amp;nbsp;컴퓨팅&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;border-left: #0B2161 10px solid; padding-right: 10px; border-bottom: #0B2161 2px solid; pading-bottom: px; padding-top: 0px; margin: 10px 0px 5px; line-height: 30px;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;b&gt;18. &amp;nbsp;NUMA와 cgroups 통합&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;cgroups v2의&amp;nbsp;cpuset&amp;nbsp;컨트롤러를&amp;nbsp;사용하면&amp;nbsp;컨테이너(Container)나&amp;nbsp;프로세스&amp;nbsp;그룹을&amp;nbsp;특정&amp;nbsp;NUMA&amp;nbsp;노드에&amp;nbsp;격리할수&amp;nbsp;있습니다. Kubernetes의&amp;nbsp;NUMA-aware&amp;nbsp;스케줄링도&amp;nbsp;이&amp;nbsp;메커니즘&amp;nbsp;위에&amp;nbsp;구현됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; 18.1&amp;nbsp; &lt;b&gt;cpuset.mems &amp;mdash; NUMA&amp;nbsp;&lt;/b&gt;&lt;b&gt;노드&lt;/b&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;b&gt;제한&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1784788601275&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# cgroups v2에서 cpuset을 사용한 NUMA 격리
# 1. cpuset 컨트롤러 활성화
$ echo &quot;+cpuset&quot; &amp;gt; /sys/fs/cgroup/cgroup.subtree_control

# 2. NUMA-격리 그룹 생성
$ mkdir /sys/fs/cgroup/numa-isolated

# 3. 사용 가능한 NUMA 노드 제한 (Node 0만 사용)
$ echo 0 &amp;gt; /sys/fs/cgroup/numa-isolated/cpuset.mems
$ echo 0-7 &amp;gt; /sys/fs/cgroup/numa-isolated/cpuset.cpus

# 4. 프로세스를 해당 cgroup에 추가
$ echo $$ &amp;gt; /sys/fs/cgroup/numa-isolated/cgroup.procs

# 확인: cpuset.mems.effective로 실제 적용된 노드 확인
$ cat /sys/fs/cgroup/numa-isolated/cpuset.mems.effective
0

# memory.numa_stat &amp;mdash; cgroup의 NUMA별 메모리 사용 통계
$ cat /sys/fs/cgroup/numa-isolated/memory.numa_stat
anon N0=12345678 N1=0
file N0=8901234 N1=0
kernel_stack N0=65536 N1=0
shmem N0=0 N1=0
file_mapped N0=4567890 N1=0
file_dirty N0=12345 N1=0&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; 18.2 &amp;nbsp;&lt;b&gt;Kubernetes NUMA-aware&amp;nbsp;&lt;/b&gt;&lt;b&gt;스케줄링&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1784788654040&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# Kubernetes Topology Manager 정책 (kubelet 설정)
#
# --topology-manager-policy:
#   none       - NUMA 인식 없음 (기본)
#   best-effort - 가능하면 같은 NUMA 노드에 배치
#   restricted - NUMA 정렬 불가 시 Pod Admission 거부
#   single-numa-node - 반드시 단일 NUMA 노드에 배치
#
# Guaranteed QoS Pod + CPU Manager static 정책 사용 시:
# 1. CPU Manager가 전용 CPU 코어 할당
# 2. Topology Manager가 같은 NUMA 노드의 CPU+메모리+장치 정렬
# 3. 커널 cpuset cgroup으로 격리 적용
#
# Pod 예시:
# resources:
#   requests:
#     cpu: &quot;4&quot;
#     memory: &quot;8Gi&quot;
#   limits:
#     cpu: &quot;4&quot;
#     memory: &quot;8Gi&quot;
# &amp;rarr; Topology Manager가 4 CPU + 8Gi를 같은 NUMA 노드에 정렬&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;cpuset:&lt;/b&gt;&amp;nbsp;cpuset.mems의&amp;nbsp;상세&amp;nbsp;동작,&amp;nbsp;cpuset.mems.partition을&amp;nbsp;이용한&amp;nbsp;노드&amp;nbsp;격리,&amp;nbsp;isolcpus/nohz_full과의&amp;nbsp;조합은&amp;nbsp;&lt;a style=&quot;color: #333333;&quot; href=&quot;https://www.minzkn.com/linuxkernel/pages/cpusets.html&quot;&gt;cpusets &amp;amp; CPU Isolation&lt;/a&gt;&amp;nbsp;문서를&amp;nbsp;참조하세요.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #0b57d0; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;운영체제&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;border-left: #0B2161 10px solid; padding-right: 10px; border-bottom: #0B2161 2px solid; pading-bottom: px; padding-top: 0px; margin: 10px 0px 5px; line-height: 30px;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;b&gt;19. &amp;nbsp;NUMA 메모리 핫플러그&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;서버&amp;nbsp;환경에서&amp;nbsp;메모리를&amp;nbsp;온라인&amp;nbsp;상태에서&amp;nbsp;추가/제거하는&amp;nbsp;메모리&amp;nbsp;핫플러그는&amp;nbsp;NUMA&amp;nbsp;토폴로지와&amp;nbsp;밀접합니다.&amp;nbsp;새&amp;nbsp;메모리는&amp;nbsp;특정&amp;nbsp;NUMA&amp;nbsp;노드에&amp;nbsp;속하며,&amp;nbsp;제거&amp;nbsp;시에는&amp;nbsp;해당&amp;nbsp;노드의&amp;nbsp;페이지를&amp;nbsp;먼저&amp;nbsp;마이그레이션해야&amp;nbsp;합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-07-23 오후 3.38.18.png&quot; data-origin-width=&quot;1544&quot; data-origin-height=&quot;608&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bK8ZU3/dJMcadCHSMM/H24kj9LK8ynMW1MGL1pKmK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bK8ZU3/dJMcadCHSMM/H24kj9LK8ynMW1MGL1pKmK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bK8ZU3/dJMcadCHSMM/H24kj9LK8ynMW1MGL1pKmK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbK8ZU3%2FdJMcadCHSMM%2FH24kj9LK8ynMW1MGL1pKmK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1544&quot; height=&quot;608&quot; data-filename=&quot;스크린샷 2026-07-23 오후 3.38.18.png&quot; data-origin-width=&quot;1544&quot; data-origin-height=&quot;608&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1784788753544&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 메모리 핫플러그 &amp;mdash; 노드별 메모리 블록 확인
$ ls /sys/devices/system/memory/
memory0  memory1  memory2  ...  block_size_bytes  probe

# 메모리 블록이 속한 NUMA 노드 확인
$ cat /sys/devices/system/memory/memory32/phys_device
1     # Node 1에 속함

# 메모리 블록 온라인/오프라인
$ echo online &amp;gt; /sys/devices/system/memory/memory32/state    # 온라인
$ echo offline &amp;gt; /sys/devices/system/memory/memory32/state   # 오프라인

# 오프라인 실패 시: 해당 블록에 이동 불가능한 페이지가 있음
# &amp;rarr; movable zone에 할당된 메모리만 오프라인 가능
# &amp;rarr; CONFIG_MEMORY_HOTREMOVE=y 필요

# 메모리를 특정 존으로 온라인 (v5.1+)
$ echo online_movable &amp;gt; /sys/devices/system/memory/memory32/state
# online_movable: ZONE_MOVABLE로 추가 (핫 리무브 가능)
# online_kernel:  ZONE_NORMAL로 추가 (커널 할당 가능)&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1784788781738&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/* mm/memory_hotplug.c &amp;mdash; 핫플러그 콜백 체인 */

/*
 * 메모리 핫플러그 시 발생하는 노티파이어 이벤트:
 *
 * MEM_GOING_ONLINE  &amp;mdash; 메모리 온라인 준비 (거부 가능)
 * MEM_ONLINE        &amp;mdash; 메모리 온라인 완료
 * MEM_GOING_OFFLINE &amp;mdash; 메모리 오프라인 준비 (페이지 마이그레이션)
 * MEM_OFFLINE       &amp;mdash; 메모리 오프라인 완료
 * MEM_CANCEL_ONLINE &amp;mdash; 온라인 취소
 * MEM_CANCEL_OFFLINE &amp;mdash; 오프라인 취소
 */

/* 노드의 메모리가 모두 오프라인되면 node_states 업데이트 */
static void node_states_check_changes_offline(
    unsigned long nr_pages,
    struct zone *zone,
    struct memory_notify *arg)
{
    struct pglist_data *pgdat = zone-&amp;gt;zone_pgdat;

/* 노드에 메모리가 남아있는지 확인 */
    if (!node_present_pages(pgdat-&amp;gt;node_id)) {
        /* 메모리 없는 노드 &amp;rarr; N_MEMORY 상태 해제 */
        arg-&amp;gt;status_change_nid = pgdat-&amp;gt;node_id;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;핫&amp;nbsp;리무브&amp;nbsp;제약&lt;/span&gt;:&lt;/b&gt;&amp;nbsp;ZONE_NORMAL에&amp;nbsp;할당된&amp;nbsp;커널&amp;nbsp;메모리(slab, page table&amp;nbsp;등)는&amp;nbsp;마이그레이션이&amp;nbsp;불가능하므로오프라인할&amp;nbsp;수&amp;nbsp;없습니다.&amp;nbsp;핫&amp;nbsp;리무브가&amp;nbsp;필요한&amp;nbsp;환경에서는&amp;nbsp;새&amp;nbsp;메모리를&amp;nbsp;online_movable로추가하여&amp;nbsp;ZONE_MOVABLE에&amp;nbsp;배치해야&amp;nbsp;합니다.&amp;nbsp;자세한&amp;nbsp;내용은&amp;nbsp;&lt;a style=&quot;color: #333333;&quot; href=&quot;https://www.minzkn.com/linuxkernel/pages/memory.html#memory-hotplug&quot;&gt;메모리&amp;nbsp;&amp;mdash;&amp;nbsp;핫플러그&lt;/a&gt;를&amp;nbsp;참조하세요.&amp;nbsp;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #0b57d0; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;소프트웨어&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;border-left: #0B2161 10px solid; padding-right: 10px; border-bottom: #0B2161 2px solid; pading-bottom: px; padding-top: 0px; margin: 10px 0px 5px; line-height: 30px;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;b&gt;20. &amp;nbsp;NUMA와 Hugepage&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Hugepage&amp;nbsp;할당은&amp;nbsp;NUMA&amp;nbsp;토폴로지의&amp;nbsp;영향을&amp;nbsp;크게&amp;nbsp;받습니다. 2MB/1GB&amp;nbsp;대형&amp;nbsp;페이지는&amp;nbsp;한번&amp;nbsp;할당되면마이그레이션&amp;nbsp;비용이&amp;nbsp;매우&amp;nbsp;높으므로,&amp;nbsp;초기&amp;nbsp;배치가&amp;nbsp;특히&amp;nbsp;중요합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; 20.1&amp;nbsp; &lt;b&gt;HugeTLB&amp;nbsp;&lt;/b&gt;&lt;b&gt;노드별&lt;/b&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;b&gt;할당&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1784788855754&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 시스템 전체 hugepage 설정 (모든 노드에 균등 분배)
$ echo 1024 &amp;gt; /proc/sys/vm/nr_hugepages

# 특정 노드에만 hugepage 할당 (권장)
$ echo 512 &amp;gt; /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages
$ echo 512 &amp;gt; /sys/devices/system/node/node1/hugepages/hugepages-2048kB/nr_hugepages

# 노드별 hugepage 현황 확인
$ cat /sys/devices/system/node/node0/hugepages/hugepages-2048kB/free_hugepages
480
$ cat /sys/devices/system/node/node1/hugepages/hugepages-2048kB/free_hugepages
510

# 1GB hugepage (노드별)
$ echo 4 &amp;gt; /sys/devices/system/node/node0/hugepages/hugepages-1048576kB/nr_hugepages

# numactl + hugepage 조합
$ numactl --membind=0 --hugepage ./database_app
# 또는 mbind() + MAP_HUGETLB 조합으로 프로그래밍&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; 20.2 &amp;nbsp;&lt;b&gt;THP(Transparent Huge Pages)&lt;/b&gt;&lt;b&gt;와&lt;/b&gt;&lt;b&gt;&amp;nbsp;NUMA&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1784788912009&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/*
 * THP 할당 시 NUMA 고려사항:
 *
 * 1. THP는 연속 2MB 물리 메모리 필요 &amp;rarr; 노드별 가용 연속 메모리 차이
 * 2. khugepaged가 THP 콜랩싱 시 페이지들의 노드를 확인
 *    &amp;rarr; 다른 노드에 흩어진 4KB 페이지를 하나의 THP로 합칠 때
 *       다수 페이지가 있는 노드에 THP 할당
 * 3. NUMA balancing + THP:
 *    &amp;rarr; 2MB 단위로 NUMA hinting fault 발생
 *    &amp;rarr; 마이그레이션 시 2MB 복사 (4KB 대비 512배 비용)
 *    &amp;rarr; MADV_HUGEPAGE 영역의 NUMA 배치가 특히 중요
 */

/* mm/khugepaged.c &amp;mdash; THP collapse 시 NUMA 노드 선택 */
static int hpage_collapse_find_target_node(
    struct collapse_control *cc)
{
    int nid, target_nid, max_count = 0;

	/* 각 노드에 있는 원본 페이지 수를 집계 */
    for_each_online_node(nid) {
        if (cc-&amp;gt;node_load[nid] &amp;gt; max_count) {
            max_count = cc-&amp;gt;node_load[nid];
            target_nid = nid;
        }
    }
    /* 가장 많은 페이지가 있는 노드에 THP 할당 */
    return target_nid;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;Hugepage&lt;/span&gt;:&lt;/b&gt;&amp;nbsp;hugetlbfs&amp;nbsp;마운트(Mount)&amp;nbsp;옵션, THP&amp;nbsp;정책(always/madvise/never), khugepaged&amp;nbsp;튜닝, compound page&amp;nbsp;구조에&amp;nbsp;대한&amp;nbsp;상세&amp;nbsp;내용은&amp;nbsp;&lt;a style=&quot;color: #333333;&quot; href=&quot;https://www.minzkn.com/linuxkernel/pages/hugepages.html&quot;&gt;Huge Pages&lt;/a&gt;&amp;nbsp;문서를&amp;nbsp;참조하세요.&amp;nbsp;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #0b57d0; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;컴퓨터&amp;nbsp;메모리&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;border-left: #0B2161 10px solid; padding-right: 10px; border-bottom: #0B2161 2px solid; pading-bottom: px; padding-top: 0px; margin: 10px 0px 5px; line-height: 30px;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;b&gt;21. &amp;nbsp;NUMA 배치 최적화 플레이북&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;NUMA&amp;nbsp;성능&amp;nbsp;저하는&amp;nbsp;대부분&amp;nbsp;원격&amp;nbsp;메모리&amp;nbsp;접근&amp;nbsp;증가에서&amp;nbsp;시작됩니다.&amp;nbsp;&lt;a style=&quot;color: #333333;&quot; href=&quot;https://www.minzkn.com/linuxkernel/pages/numa.html&quot;&gt;&amp;nbsp;CPU&lt;/a&gt;&amp;nbsp;바인딩과&amp;nbsp;메모리&amp;nbsp;바인딩을&amp;nbsp;함께설정하고,&amp;nbsp;자동&amp;nbsp;밸런싱이&amp;nbsp;실제로&amp;nbsp;도움되는지&amp;nbsp;워크로드별로&amp;nbsp;검증해야&amp;nbsp;합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-07-23 오후 3.43.42.png&quot; data-origin-width=&quot;1544&quot; data-origin-height=&quot;716&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cT3mKJ/dJMcaalKFiN/36E74JCkQphwy1IasnN4nK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cT3mKJ/dJMcaalKFiN/36E74JCkQphwy1IasnN4nK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cT3mKJ/dJMcaalKFiN/36E74JCkQphwy1IasnN4nK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcT3mKJ%2FdJMcaalKFiN%2F36E74JCkQphwy1IasnN4nK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1544&quot; height=&quot;716&quot; data-filename=&quot;스크린샷 2026-07-23 오후 3.43.42.png&quot; data-origin-width=&quot;1544&quot; data-origin-height=&quot;716&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;color: #000000; text-align: start; border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; width=&quot;763&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style13&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;워크로드 유형&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;권장 정책&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;확인 지표&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;지연 민감&amp;nbsp;DB&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;--cpunodebind&amp;nbsp;+&amp;nbsp;--membind&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;remote hit&amp;nbsp;비율, tail latency&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;대규모 배치 처리&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;interleave&amp;nbsp;또는 자동 밸런싱&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;처리량(Throughput)/CPU&amp;nbsp;사용률&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;혼합 컨테이너 환경&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;cgroup&amp;nbsp;메모리/CPU&amp;nbsp;격리&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;노드별&amp;nbsp;reclaim/oom&amp;nbsp;분포&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;i&gt;#&amp;nbsp;&lt;/i&gt;&lt;i&gt;배치&lt;/i&gt;&lt;i&gt;/&lt;/i&gt;&lt;i&gt;로컬리티&lt;/i&gt;&lt;i&gt;&amp;nbsp;&lt;/i&gt;&lt;i&gt;점검&lt;/i&gt;numactl --hardwarenumastat -p &amp;lt;pid&amp;gt;cat /proc/&amp;lt;pid&amp;gt;/numa_maps | head&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;border-left: #0B2161 10px solid; padding-right: 10px; border-bottom: #0B2161 2px solid; pading-bottom: px; padding-top: 0px; margin: 10px 0px 5px; line-height: 30px;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;b&gt;22. &amp;nbsp; task_numa_fault() &amp;rarr; task_numa_placement() 체인&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Automatic NUMA Balancing의&amp;nbsp;핵심&amp;nbsp;판단&amp;nbsp;경로는&amp;nbsp;do_numa_page()에서시작하여&amp;nbsp;task_numa_fault(),&amp;nbsp;task_numa_placement(),&amp;nbsp;task_numa_find_cpu()로&amp;nbsp;이어지는&amp;nbsp;함수&amp;nbsp;호출&amp;nbsp;체인입니다.&amp;nbsp;이&amp;nbsp;체인은NUMA hinting fault가&amp;nbsp;발생할&amp;nbsp;때마다&amp;nbsp;실행되며,&amp;nbsp;페이지와&amp;nbsp;태스크의&amp;nbsp;최적&amp;nbsp;배치를&amp;nbsp;결정합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #0b57d0; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;분산&amp;nbsp;및&amp;nbsp;클라우드&amp;nbsp;컴퓨팅&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-07-23 오후 3.45.09.png&quot; data-origin-width=&quot;1430&quot; data-origin-height=&quot;1034&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bPzqND/dJMcaaMT9FP/XKidIoNCPK61C2pMxlQIek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bPzqND/dJMcaaMT9FP/XKidIoNCPK61C2pMxlQIek/img.png&quot; data-alt=&quot;NUMA Balancing&amp;amp;nbsp; 판단 &amp;amp;nbsp; 경로 &amp;amp;nbsp;&amp;amp;mdash; do_numa_page() 에서 &amp;amp;nbsp;task_numa_find_cpu() 까지의 &amp;amp;nbsp; 함수 &amp;amp;nbsp; 호출 &amp;amp;nbsp; 체인&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bPzqND/dJMcaaMT9FP/XKidIoNCPK61C2pMxlQIek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbPzqND%2FdJMcaaMT9FP%2FXKidIoNCPK61C2pMxlQIek%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1430&quot; height=&quot;1034&quot; data-filename=&quot;스크린샷 2026-07-23 오후 3.45.09.png&quot; data-origin-width=&quot;1430&quot; data-origin-height=&quot;1034&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;NUMA Balancing&amp;nbsp; 판단 &amp;nbsp; 경로 &amp;nbsp;&amp;mdash; do_numa_page() 에서 &amp;nbsp;task_numa_find_cpu() 까지의 &amp;nbsp; 함수 &amp;nbsp; 호출 &amp;nbsp; 체인&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #0b57d0; color: #000000; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;i&gt;컴퓨터과학&lt;/i&gt;&lt;i&gt;&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;task_numa_fault()&lt;/b&gt;&lt;/span&gt;는&amp;nbsp;NUMA hinting fault의&amp;nbsp;통계&amp;nbsp;수집과&amp;nbsp;배치&amp;nbsp;판단을&amp;nbsp;연결하는&amp;nbsp;핵심&amp;nbsp;함수입니다.&amp;nbsp;각&amp;nbsp;폴트에서접근된&amp;nbsp;노드&amp;nbsp;정보를&amp;nbsp;기록하고,&amp;nbsp;스캔&amp;nbsp;주기가&amp;nbsp;갱신될&amp;nbsp;때&amp;nbsp;&lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;task_numa_placement()&lt;/b&gt;&lt;/span&gt;를&amp;nbsp;호출하여&amp;nbsp;최적&amp;nbsp;노드를재계산합니다.&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1784789179947&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/* kernel/sched/fair.c &amp;mdash; task_numa_fault() 간략화 */
void task_numa_fault(int last_cpupid, int mem_node,
                     int pages, int flags)
{
    struct task_struct *p = current;
    bool migrated = flags &amp;amp; TNF_MIGRATED;
    int cpu_node = cycpupid_to_nid(last_cpupid);
    int local = !!(flags &amp;amp; TNF_FAULT_LOCAL);
    struct numa_group *ng;
    int priv;

	/* 1. 커널 스레드나 NUMA 비활성 태스크는 무시 */
    if (!p-&amp;gt;mm)
        return;

	/* 2. 접근이 현재 CPU의 로컬인지 판단 */
    priv = cpupid_match_pid(p, last_cpupid);
    if (!priv &amp;amp;&amp;amp; !local)
        flags |= TNF_SHARED;

	/* 3. 태스크의 numa_faults[] 배열 갱신
     *    인덱스: (node * 4) + type
     *    type: NUMA_MEM(0), NUMA_CPU(1),
     *          NUMA_MEMBUF(2), NUMA_CPUBUF(3) */
    p-&amp;gt;numa_faults[task_faults_idx(NUMA_MEMBUF, mem_node, priv)] += pages;
    p-&amp;gt;numa_faults[task_faults_idx(NUMA_CPUBUF, cpu_node, priv)] += pages;

	/* 4. NUMA 그룹이 있으면 그룹 faults도 갱신 */
    ng = deref_curr_numa_group(p);
    if (ng) {
        spin_lock_irq(&amp;amp;ng-&amp;gt;lock);
        ng-&amp;gt;faults[task_faults_idx(NUMA_MEM, mem_node, priv)] += pages;
        ng-&amp;gt;total_faults += pages;
        spin_unlock_irq(&amp;amp;ng-&amp;gt;lock);
    }

	/* 5. 스캔 시퀀스 변경 시 &amp;rarr; 배치 재계산 */
    if (p-&amp;gt;numa_scan_seq != p-&amp;gt;mm-&amp;gt;numa_scan_seq) {
        p-&amp;gt;numa_scan_seq = p-&amp;gt;mm-&amp;gt;numa_scan_seq;
        task_numa_placement(p);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #263238; color: #eeffff; text-align: start;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;&amp;nbsp; &amp;nbsp; 3&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;행: last_cpupid는 이전에 이 페이지에 접근한 CPU&lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;PID 정보로&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; PROT_NONE fault 시 PTE에 인코딩된 값입니다.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;&amp;nbsp; &amp;nbsp; 8&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;행: TNF_MIGRATED 플래그는 이 폴트로 인해 페이지가 실제로 마이그레이션되었는지를 나타냅니다.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;&amp;nbsp; 16&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;행: &lt;/span&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;cpupid_match_pid&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;는 이전 접근자가 현재 태스크인지 확인합니다. 같은 태스크만 접근하면 private 접근으로 분류됩니다.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;&amp;nbsp; 18&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;행: TNF_SHARED는 여러 태스크가 같은 페이지를 접근할 때 설정됩니다. 공유 페이지는 마이그레이션 판단이 더 보수적입니다.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;&amp;nbsp; 22&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;행: numa_faults[]는 &lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;4&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;개 유형&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;MEM&lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;CPU&lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;MEMBUF&lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;CPUBUF&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &amp;times; 노드 수 &amp;times; &lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;private&lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;shared&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;로 구성됩니다. BUF 접미사가 붙은 것은 현재 스캔 주기의 버퍼입니다.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;&amp;nbsp; 33&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;행: numa_scan_seq가 변경되면 한 스캔 주기가 완료된 것입니다. 이때 누적된 폴트 데이터를 기반으로 &lt;/span&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;task_numa_placement&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;가 최적 배치를 재계산합니다.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;호출&lt;/b&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;b&gt;빈도&lt;/b&gt;&lt;b&gt;:&lt;/b&gt;&amp;nbsp;task_numa_fault()는&amp;nbsp;NUMA hinting fault마다&amp;nbsp;호출되지만,&amp;nbsp;task_numa_placement()는&amp;nbsp;스캔&amp;nbsp;시퀀스가&amp;nbsp;변경될때만&amp;nbsp;호출됩니다.&amp;nbsp;스캔&amp;nbsp;주기가&amp;nbsp;1초~60초이므로&amp;nbsp;placement&amp;nbsp;재계산은&amp;nbsp;상대적으로&amp;nbsp;드물게&amp;nbsp;발생하여&amp;nbsp;오버헤드를제한합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;border-left: #0B2161 10px solid; padding-right: 10px; border-bottom: #0B2161 2px solid; pading-bottom: px; padding-top: 0px; margin: 10px 0px 5px; line-height: 30px;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;b&gt;23. &amp;nbsp;struct numa_group 심층 분석&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;struct numa_group&lt;/b&gt;&lt;/span&gt;은&amp;nbsp;메모리를&amp;nbsp;공유하는&amp;nbsp;태스크들을&amp;nbsp;그룹으로&amp;nbsp;묶어,&amp;nbsp;스케줄러가&amp;nbsp;그룹&amp;nbsp;전체의&amp;nbsp;NUMA&amp;nbsp;배치를최적화할&amp;nbsp;수&amp;nbsp;있게&amp;nbsp;합니다.&amp;nbsp;멀티스레드&amp;nbsp;애플리케이션에서&amp;nbsp;같은&amp;nbsp;공유&amp;nbsp;메모리를&amp;nbsp;접근하는&amp;nbsp;스레드들이&amp;nbsp;자동으로하나의&amp;nbsp;NUMA&amp;nbsp;그룹으로&amp;nbsp;합쳐집니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-07-23 오후 3.50.16.png&quot; data-origin-width=&quot;1430&quot; data-origin-height=&quot;978&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bYJRCA/dJMcaazom5a/YiAbt7fdxTAEfjmrUHKL3K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bYJRCA/dJMcaazom5a/YiAbt7fdxTAEfjmrUHKL3K/img.png&quot; data-alt=&quot;numa_group 과 &amp;amp;nbsp;task_struct 의 &amp;amp;nbsp;NUMA&amp;amp;nbsp; 관련 &amp;amp;nbsp; 필드 &amp;amp;nbsp;&amp;amp;mdash;&amp;amp;nbsp; 공유 &amp;amp;nbsp; 메모리 &amp;amp;nbsp; 접근 &amp;amp;nbsp; 패턴 &amp;amp;nbsp; 기반 &amp;amp;nbsp; 그룹 &amp;amp;nbsp; 형성&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bYJRCA/dJMcaazom5a/YiAbt7fdxTAEfjmrUHKL3K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbYJRCA%2FdJMcaazom5a%2FYiAbt7fdxTAEfjmrUHKL3K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1430&quot; height=&quot;978&quot; data-filename=&quot;스크린샷 2026-07-23 오후 3.50.16.png&quot; data-origin-width=&quot;1430&quot; data-origin-height=&quot;978&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;numa_group 과 &amp;nbsp;task_struct 의 &amp;nbsp;NUMA&amp;nbsp; 관련 &amp;nbsp; 필드 &amp;nbsp;&amp;mdash;&amp;nbsp; 공유 &amp;nbsp; 메모리 &amp;nbsp; 접근 &amp;nbsp; 패턴 &amp;nbsp; 기반 &amp;nbsp; 그룹 &amp;nbsp; 형성&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #0b57d0; color: #000000; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;i&gt;컴퓨터&lt;/i&gt;&lt;i&gt;&amp;nbsp;&lt;/i&gt;&lt;i&gt;메모리&lt;/i&gt;&lt;i&gt;&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1784789505738&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/* kernel/sched/fair.c &amp;mdash; numa_group 구조체와 태스크 NUMA 필드 */

/* numa_faults[] 배열 인덱스 계산
 * 4가지 유형 &amp;times; 노드 수 &amp;times; 2(private/shared) = 8 * nr_node_ids */
enum numa_faults_stats {
    NUMA_MEM = 0,      /* 메모리 노드 폴트 (페이지 위치) */
    NUMA_CPU,           /* CPU 노드 폴트 (접근한 CPU 위치) */
    NUMA_MEMBUF,        /* 현재 주기 메모리 버퍼 */
    NUMA_CPUBUF,        /* 현재 주기 CPU 버퍼 */
};

static inline int task_faults_idx(
    enum numa_faults_stats s, int nid, int priv)
{
    return NR_NUMA_HINT_FAULT_TYPES * (s * nr_node_ids + nid) + priv;
}

/* task_weight: 태스크 개별 폴트 가중치
 * 특정 노드에서의 private 폴트가 많을수록 높은 점수 */
static inline unsigned long task_weight(
    struct task_struct *p, int nid, int dist)
{
    unsigned long faults, total_faults;

	/* private + shared 폴트 합산 */
    faults = p-&amp;gt;numa_faults[task_faults_idx(NUMA_MEM, nid, 0)] +
             p-&amp;gt;numa_faults[task_faults_idx(NUMA_MEM, nid, 1)];
    total_faults = p-&amp;gt;total_numa_faults;

	if (!total_faults)
        return 0;
    return 1000 * faults / total_faults;
}

/* group_weight: 그룹 전체의 폴트 가중치 */
static inline unsigned long group_weight(
    struct task_struct *p, int nid, int dist)
{
    struct numa_group *ng = deref_curr_numa_group(p);
    unsigned long faults, total_faults;

	if (!ng)
        return 0;

	faults = ng-&amp;gt;faults[task_faults_idx(NUMA_MEM, nid, 0)] +
             ng-&amp;gt;faults[task_faults_idx(NUMA_MEM, nid, 1)];
    total_faults = ng-&amp;gt;total_faults;

	if (!total_faults)
        return 0;

	return 1000 * faults / total_faults;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #263238; color: #eeffff; text-align: start;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;&amp;nbsp; &amp;nbsp; 4&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;행: numa_faults[] 배열은 &lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;4&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;가지 통계 유형&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;MEM&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; CPU&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; MEMBUF&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; CPUBUF&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;을 노드별&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; private&lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;shared 구분으로 저장합니다. BUF 유형은 현재 스캔 주기의 임시 버퍼로&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; 주기 종료 시 MEM&lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;CPU로 합산됩니다.칩 및 프로세서&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;&amp;nbsp; 15&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;행: &lt;/span&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;task_faults_idx&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;는 다차원 배열을 &lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;차원으로 평탄화한 인덱스 계산 함수입니다. NR_NUMA_HINT_FAULT_TYPES은 &lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;private&lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; shared&lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;입니다.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;&amp;nbsp; 25&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;행: &lt;/span&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;task_weight&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;는 특정 노드에 대한 태스크의 메모리 접근 비율을 &lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;1000&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;분율로 계산합니다. 높을수록 해당 노드에 태스크를 배치할 이유가 강합니다.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;&amp;nbsp; 38&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;행: &lt;/span&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;group_weight&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;는 numa_group 전체의 폴트를 기반으로 가중치를 계산합니다. 그룹이 있으면 개별 태스크뿐 아니라 그룹 전체의 메모리 접근 패턴을 반영하여 배치를 결정합니다.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;border-left: #0B2161 10px solid; padding-right: 10px; border-bottom: #0B2161 2px solid; pading-bottom: px; padding-top: 0px; margin: 10px 0px 5px; line-height: 30px;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;b&gt;24. &amp;nbsp;NUMA&amp;nbsp;페이지&amp;nbsp;마이그레이션&amp;nbsp;경로&amp;nbsp;분석&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;NUMA balancing이&amp;nbsp;페이지&amp;nbsp;마이그레이션을&amp;nbsp;결정하면,&amp;nbsp;migrate_misplaced_page()에서&amp;nbsp;시작되는&amp;nbsp;마이그레이션체인이&amp;nbsp;실행됩니다.&amp;nbsp;이&amp;nbsp;경로는&amp;nbsp;페이지&amp;nbsp;격리,&amp;nbsp;노드&amp;nbsp;간&amp;nbsp;복사, PTE&amp;nbsp;재매핑을&amp;nbsp;포함하며,&amp;nbsp;마이그레이션&amp;nbsp;실패&amp;nbsp;시&amp;nbsp;원래위치를&amp;nbsp;유지합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1784789689854&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/* mm/migrate.c &amp;mdash; NUMA misplaced 페이지 마이그레이션 */
int migrate_misplaced_page(struct page *page,
                          struct vm_area_struct *vma,
                          int node)
{
    struct folio *folio = page_folio(page);
    pg_data_t *pgdat = NODE_DATA(node);
    int nr_remaining;
    unsigned int nr_succeeded;
    LIST_HEAD(migratepages);

	/* 1. 마이그레이션 속도 제한 (rate limiting)
     *    너무 많은 마이그레이션이 동시에 발생하면 성능 저하 */
    if (rate_limited_count_exceeded(pgdat))
        goto out;

	/* 2. folio 격리: LRU에서 분리
     *    마이그레이션 중 다른 경로에서 접근하지 않도록 */
    if (numamigrate_isolate_folio(pgdat, folio))
        goto out;

	list_add(&amp;amp;folio-&amp;gt;lru, &amp;amp;migratepages);
    nr_remaining = migrate_pages(&amp;amp;migratepages,
                                 alloc_misplaced_dst_folio,
                                 NULL, node,
                                 MIGRATE_ASYNC,
                                 MR_NUMA_MISPLACED,
                                 &amp;amp;nr_succeeded);

	if (nr_remaining) {
        /* 마이그레이션 실패: 원본 folio를 LRU에 복귀 */
        if (!list_empty(&amp;amp;migratepages))
            putback_movable_pages(&amp;amp;migratepages);
    }

	return nr_succeeded;
out:
    folio_put(folio);
    return 0;
}

/* mm/migrate.c &amp;mdash; NUMA 마이그레이션용 folio 격리 */
static bool numamigrate_isolate_folio(
    pg_data_t *pgdat, struct folio *folio)
{
    /* 노드별 마이그레이션 허용량 검사
     * numabalancing_migrate_nr_pages 초과 시 거부
     * &amp;rarr; 한 노드에 너무 많은 페이지가 한꺼번에 몰리는 것 방지 */
    if (pgdat-&amp;gt;numabalancing_migrate_nr_pages &amp;gt;
        NUMA_MIGRATION_THRESHOLD) {
        if (time_before(jiffies,
            pgdat-&amp;gt;numabalancing_migrate_next_window))
            return true;  /* 속도 제한 */
        pgdat-&amp;gt;numabalancing_migrate_nr_pages = 0;
        pgdat-&amp;gt;numabalancing_migrate_next_window =
            jiffies + 2 * HZ;
    }

	/* LRU에서 folio 분리 */
    if (!folio_isolate_lru(folio))
        return true;  /* 격리 실패 */

	pgdat-&amp;gt;numabalancing_migrate_nr_pages += folio_nr_pages(folio);
    return false;  /* 성공 */
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #263238; color: #eeffff; text-align: start;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;&amp;nbsp; 14&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;행: 속도 제한&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;rate limiting&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;은 NUMA balancing이 한 번에 너무 많은 페이지를 마이그레이션하여 시스템 성능을 저하시키는 것을 방지합니다. &lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;초 윈도우당 허용량을 제한합니다.분산 및 클라우드 컴퓨팅&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;&amp;nbsp; 19&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;행: &lt;/span&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;numamigrate_isolate_folio&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;는 folio를 LRU 리스트에서 분리합니다. 격리하지 않으면 kswapd 등 다른 경로가 동시에 같은 페이지를 조작할 수 있습니다.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;&amp;nbsp; 23&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;행: &lt;/span&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;migrate_pages&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;는 범용 마이그레이션 엔진입니다. &lt;/span&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;alloc_misplaced_dst_folio&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;가 대상 노드에서 새 folio를 할당하고&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; MIGRATE_ASYNC 모드로 비동기 마이그레이션을 수행합니다.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;&amp;nbsp; 27&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;행: MR_NUMA_MISPLACED는 마이그레이션 사유&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;reason&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;를 나타냅니다. &lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;proc&lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;vmstat의 pgmigrate_success&lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;pgmigrate_fail 통계에서 사유별로 구분됩니다.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;&amp;nbsp; 31&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;행: 마이그레이션 실패 시 &lt;/span&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;putback_movable_pages&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;로 원본 folio를 LRU에 복귀시킵니다. 대상 노드 메모리 부족이나 folio가 pinned 상태일 때 실패할 수 있습니다.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;&amp;nbsp; 47&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;행: numabalancing_migrate_next_window는 다음 윈도우 시작 시간입니다. &lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;초&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;HZ&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; 간격으로 윈도우가 갱신되며&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; 각 윈도우에서 마이그레이션 카운터가 초기화됩니다.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;마이그레이션&amp;nbsp;비용&lt;/span&gt;:&lt;/b&gt;&amp;nbsp;NUMA&amp;nbsp;페이지&amp;nbsp;마이그레이션은&amp;nbsp;페이지&amp;nbsp;&lt;a style=&quot;color: #333333;&quot; href=&quot;https://www.minzkn.com/linuxkernel/pages/numa.html&quot;&gt;&amp;nbsp;데이터&lt;/a&gt;&amp;nbsp;복사(4KB&amp;nbsp;또는&amp;nbsp;2MB THP), PTE&amp;nbsp;언매핑/재매핑, TLB&amp;nbsp;플러시(Flush)를&amp;nbsp;수반합니다.&amp;nbsp;특히&amp;nbsp;THP의&amp;nbsp;경우&amp;nbsp;2MB를&amp;nbsp;복사해야&amp;nbsp;하므로&amp;nbsp;마이그레이션비용이&amp;nbsp;512배&amp;nbsp;증가합니다.&amp;nbsp;이&amp;nbsp;때문에&amp;nbsp;커널은&amp;nbsp;&lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;rate_limited_count_exceeded()&lt;/b&gt;&lt;/span&gt;로&amp;nbsp;마이그레이션&amp;nbsp;속도를&amp;nbsp;제한하고,&amp;nbsp;실제로&amp;nbsp;이득이&amp;nbsp;있는&amp;nbsp;경우에만&amp;nbsp;마이그레이션을&amp;nbsp;수행합니다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;border-left: #0B2161 10px solid; padding-right: 10px; border-bottom: #0B2161 2px solid; pading-bottom: px; padding-top: 0px; margin: 10px 0px 5px; line-height: 30px;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;b&gt;25. &amp;nbsp;NUMA 메모리 정책 커널 경로&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;set_mempolicy()&lt;/b&gt;&lt;/span&gt;와&amp;nbsp;&lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;mbind()&lt;/b&gt;&lt;/span&gt;는&amp;nbsp;결국&amp;nbsp;커널&amp;nbsp;내부의&amp;nbsp;&lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;struct mempolicy&lt;/b&gt;&lt;/span&gt;로&amp;nbsp;수렴합니다.&amp;nbsp;페이지&amp;nbsp;할당&amp;nbsp;hot path에서는&amp;nbsp;이&amp;nbsp;정책객체의&amp;nbsp;mode, flags, nodemask를&amp;nbsp;읽어&amp;nbsp;&lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;alloc_pages_mpol()&lt;/b&gt;&lt;/span&gt;이&amp;nbsp;대상&amp;nbsp;노드를&amp;nbsp;고릅니다.&amp;nbsp;다만&amp;nbsp;shared policy lookup, reference count, cpuset&amp;nbsp;재바인딩이&amp;nbsp;섞이면&amp;nbsp;사용자&amp;nbsp;공간에서&amp;nbsp;보는&amp;nbsp;&quot;간단한&amp;nbsp;nodemask&quot;보다&amp;nbsp;실제&amp;nbsp;경로가&amp;nbsp;더복잡해집니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-07-23 오후 3.57.49.png&quot; data-origin-width=&quot;1510&quot; data-origin-height=&quot;868&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bUu81S/dJMcaae5vMO/AihSs4WUTk9RbG9PcdpHt1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bUu81S/dJMcaae5vMO/AihSs4WUTk9RbG9PcdpHt1/img.png&quot; data-alt=&quot;NUMA&amp;amp;nbsp; 메모리 &amp;amp;nbsp; 정책 &amp;amp;nbsp;&amp;amp;mdash; alloc_pages_mpol() 의 &amp;amp;nbsp; 정책별 &amp;amp;nbsp; 분기와 &amp;amp;nbsp;struct mempolicy&amp;amp;nbsp; 구조&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bUu81S/dJMcaae5vMO/AihSs4WUTk9RbG9PcdpHt1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbUu81S%2FdJMcaae5vMO%2FAihSs4WUTk9RbG9PcdpHt1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1510&quot; height=&quot;868&quot; data-filename=&quot;스크린샷 2026-07-23 오후 3.57.49.png&quot; data-origin-width=&quot;1510&quot; data-origin-height=&quot;868&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;NUMA&amp;nbsp; 메모리 &amp;nbsp; 정책 &amp;nbsp;&amp;mdash; alloc_pages_mpol() 의 &amp;nbsp; 정책별 &amp;nbsp; 분기와 &amp;nbsp;struct mempolicy&amp;nbsp; 구조&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #0b57d0; color: #000000; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;i&gt;컴퓨터&lt;/i&gt;&lt;i&gt;&amp;nbsp;&lt;/i&gt;&lt;i&gt;메모리&lt;/i&gt;&lt;i&gt;&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;hot path&amp;nbsp;관점&lt;/span&gt;:&lt;/b&gt;&amp;nbsp;&lt;b&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;struct mempolicy &lt;/span&gt;&lt;/b&gt;는&amp;nbsp;참조&amp;nbsp;카운터를&amp;nbsp;가지며, task/VMA policy는&amp;nbsp;보통&amp;nbsp;fault path에서&amp;nbsp;&lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;mmap_lock&lt;/b&gt;&lt;/span&gt;&amp;nbsp;보호아래&amp;nbsp;읽힙니다.&amp;nbsp;반면&amp;nbsp;shared policy는&amp;nbsp;lookup&amp;nbsp;중&amp;nbsp;추가&amp;nbsp;참조와&amp;nbsp;잠금&amp;nbsp;경로가&amp;nbsp;필요하므로&amp;nbsp;같은&amp;nbsp;interleave/bind&amp;nbsp;정책이라도&amp;nbsp;shared memory에서는&amp;nbsp;비용이&amp;nbsp;더&amp;nbsp;높을&amp;nbsp;수&amp;nbsp;있습니다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1784789998730&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/* mm/mempolicy.c &amp;mdash; set_mempolicy() 시스템 콜 경로 */
SYSCALL_DEFINE3(set_mempolicy, int, mode,
    const unsigned long __user *, nmask,
    unsigned long, maxnode)
{
    return kernel_set_mempolicy(mode, nmask, maxnode);
}

static long kernel_set_mempolicy(int mode,
    const unsigned long __user *nmask,
    unsigned long maxnode)
{
    nodemask_t nodes;
    unsigned short flags;

	/* 모드와 플래그 분리 */
    flags = mode &amp;amp; MPOL_MODE_FLAGS;
    mode &amp;amp;= ~MPOL_MODE_FLAGS;

	/* 사용자 공간 nodemask를 커널 nodemask로 복사 */
    get_nodes(&amp;amp;nodes, nmask, maxnode);

	return do_set_mempolicy(mode, flags, &amp;amp;nodes);
}

static long do_set_mempolicy(unsigned short mode,
    unsigned short flags, nodemask_t *nodes)
{
    struct mempolicy *new, *old;
    struct mm_struct *mm = current-&amp;gt;mm;

	/* 새 mempolicy 객체 생성 */
    new = mpol_new(mode, flags, nodes);

	/* current-&amp;gt;mempolicy 교체
     * 이후 alloc_pages()가 이 정책을 참조 */
    task_lock(current);
    old = current-&amp;gt;mempolicy;
    current-&amp;gt;mempolicy = new;
    task_unlock(current);

	mpol_put(old);
    return 0;
}

/* mm/mempolicy.c &amp;mdash; 정책 기반 페이지 할당 */
struct page *alloc_pages_mpol(gfp_t gfp,
    unsigned int order, struct mempolicy *pol,
    pgoff_t ilx, int nid)
{
    struct page *page;

	switch (pol-&amp;gt;mode) {
    case MPOL_PREFERRED:
    case MPOL_PREFERRED_MANY:
        /* 선호 노드에서 우선 시도, 실패 시 폴백 */
        nid = policy_node(gfp, pol, nid);
        break;
    case MPOL_BIND:
        /* nodemask 내에서만 할당 (zonelist 필터링) */
        gfp |= __GFP_HARDWALL;
        break;
    case MPOL_INTERLEAVE:
        /* 라운드-로빈으로 노드 선택 */
        nid = interleave_nid(pol, ilx);
        break;
    case MPOL_WEIGHTED_INTERLEAVE:
        /* 대역폭 가중치로 노드 선택 (v6.9+) */
        nid = weighted_interleave_nid(pol, ilx);
        break;
    }
    page = __alloc_pages(gfp, order, nid, policy_nodemask(gfp, pol));
    return page;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;축약&amp;nbsp;코드&amp;nbsp;해석&amp;nbsp;주의&lt;/span&gt;:&amp;nbsp;&lt;/b&gt;위&amp;nbsp;코드는&amp;nbsp;정책별&amp;nbsp;노드&amp;nbsp;선택&amp;nbsp;분기를&amp;nbsp;이해하기&amp;nbsp;위한&amp;nbsp;간략화&amp;nbsp;예시입니다.&amp;nbsp;여기서&amp;nbsp;&lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;interleave_nid(pol, ilx)&lt;/b&gt;&lt;/span&gt;는&amp;nbsp;주로&amp;nbsp;익명&amp;nbsp;페이지와&amp;nbsp;공유&amp;nbsp;메모리의&amp;nbsp;&quot;페이지&amp;nbsp;오프셋&amp;nbsp;기반&amp;nbsp;분산&quot;을&amp;nbsp;상징적으로&amp;nbsp;보여줍니다. page cache는&amp;nbsp;같은&amp;nbsp;interleave&amp;nbsp;정책이라도&amp;nbsp;태스크별&amp;nbsp;카운터를&amp;nbsp;사용하므로,&amp;nbsp;파일&amp;nbsp;I/O&amp;nbsp;배치는&amp;nbsp;주소오프셋만으로&amp;nbsp;설명되지&amp;nbsp;않습니다.&amp;nbsp;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #0b57d0; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;분산&amp;nbsp;및&amp;nbsp;클라우드&amp;nbsp;컴퓨팅&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #263238; color: #eeffff; text-align: start;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;&amp;nbsp; 17&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;행: MPOL_MODE_FLAGS로 모드 값에 포함된 플래그를 분리합니다. 모드 상위 비트에 MPOL_F_STATIC_NODES 등의 플래그가 OR됩니다.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;&amp;nbsp; 33&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;행: &lt;/span&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;mpol_new&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;는 &lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;struct&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; mempolicy를 kmem_cache에서 할당하고 초기화합니다. 참조 카운터를 1로 설정합니다.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&amp;nbsp; &lt;span style=&quot;background-color: #263238; color: #f78c6c; text-align: start;&quot;&gt;37&lt;/span&gt;행: &lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;current&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;-&amp;gt;mempolicy를 교체하면 이후 해당 태스크의 모든 페이지 할당에 새 정책이 적용됩니다. mbind()는 VMA별 정책(vma-&amp;gt;vm_policy)을 설정하며&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; 이것이 태스크 정책보다 우선합니다.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&amp;nbsp; &lt;span style=&quot;background-color: #263238; color: #f78c6c; text-align: start;&quot;&gt;52&lt;/span&gt;행: MPOL_PREFERRED는 policy_node()로 선호 노드를 반환하지만&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; 할당 실패 시 일반 zonelist 폴백이 동작합니다.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&amp;nbsp; &lt;span style=&quot;background-color: #263238; color: #f78c6c; text-align: start;&quot;&gt;56&lt;/span&gt;행: MPOL_BIND는 __GFP_HARDWALL을 추가하여 cpuset/mempolicy 범위 밖 노드로의 폴백을 차단합니다.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&amp;nbsp; &lt;span style=&quot;background-color: #263238; color: #f78c6c; text-align: start;&quot;&gt;59&lt;/span&gt;행: &lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;interleave_nid&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;() 설명은 익명 페이지와 공유 메모리에 가장 직접적으로 대응합니다. 이 경우 faulting address의 페이지 오프셋(ilx)으로 nodemask를 인덱싱합니다. page cache는 별도 태스크 카운터 기반으로 분산되므로 같은 interleave 정책이어도 파일 I/O 패턴에 따라 결과가 달라질 수 있습니다.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&amp;nbsp; &lt;span style=&quot;background-color: #263238; color: #f78c6c; text-align: start;&quot;&gt;63&lt;/span&gt;행: &lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;weighted_interleave_nid&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;()는 v6.9에서 추가된 함수로&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; 같은 interleave 경로에서 라운드-로빈 대신 sysfs 가중치(/sys/kernel/mm/mempolicy/weighted_interleave/nodeN) 비율을 적용합니다. 익명 페이지/공유 메모리는 페이지 오프셋 기반&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;page&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; cache는 태스크 카운터 기반이라는 차이는 그대로 유지됩니다. &amp;nbsp; &lt;span style=&quot;color: #c0d1e7;&quot;&gt;#데이터 관리&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;border-left: #0B2161 10px solid; padding-right: 10px; border-bottom: #0B2161 2px solid; pading-bottom: px; padding-top: 0px; margin: 10px 0px 5px; line-height: 30px;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;b&gt;26. &amp;nbsp;NUMA 스코어 계산과 노드 배치 최적화&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;task_numa_placement()&lt;/b&gt;&lt;/span&gt;는&amp;nbsp;태스크와&amp;nbsp;그룹의&amp;nbsp;NUMA&amp;nbsp;폴트&amp;nbsp;데이터를&amp;nbsp;분석하여&amp;nbsp;최적&amp;nbsp;노드를&amp;nbsp;결정합니다.&amp;nbsp;각&amp;nbsp;노드에대해&amp;nbsp;&lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;task_weight()&lt;/b&gt;&lt;/span&gt;와&amp;nbsp;&lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;group_weight()&lt;/b&gt;&lt;/span&gt;를&amp;nbsp;계산하고,&amp;nbsp;현재&amp;nbsp;배치와&amp;nbsp;이동&amp;nbsp;후&amp;nbsp;배치의&amp;nbsp;스코어를&amp;nbsp;비교하여&amp;nbsp;이동&amp;nbsp;여부를판단합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1784790323206&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/* kernel/sched/fair.c &amp;mdash; task_numa_placement() 간략화 */
static void task_numa_placement(struct task_struct *p)
{
    int seq, nid, max_nid = NUMA_NO_NODE;
    unsigned long max_faults = 0;
    unsigned long fault_types[2] = { 0, 0 };
    struct numa_group *ng;

	/* 1. 스캔 시퀀스 검증 */
    seq = READ_ONCE(p-&amp;gt;mm-&amp;gt;numa_scan_seq);
    if (p-&amp;gt;numa_scan_seq == seq)
        return;
    p-&amp;gt;numa_scan_seq = seq;

	/* 2. 각 노드에 대해 스코어 계산 */
    for_each_online_node(nid) {
        unsigned long faults = 0, group_faults = 0;
        int priv;

		for (priv = 0; priv &amp;lt; NR_NUMA_HINT_FAULT_TYPES; priv++) {
            unsigned long diff, f_new, f_old;
            int idx = task_faults_idx(NUMA_MEM, nid, priv);

			/* 지수 이동 평균 (EMA) 적용:
             * new = old/2 + buf
             * &amp;rarr; 최근 폴트에 더 큰 가중치 */
            f_old = p-&amp;gt;numa_faults[idx];
            f_new = f_old / 2 + p-&amp;gt;numa_faults[idx + 2]; /* +2 = MEMBUF */
            p-&amp;gt;numa_faults[idx] = f_new;
            p-&amp;gt;numa_faults[idx + 2] = 0; /* 버퍼 초기화 */

			faults += f_new;
            diff = abs(f_new - f_old);
            fault_types[priv] += f_new;
        }

		/* 3. 가장 높은 폴트 카운트를 가진 노드 추적 */
        if (faults &amp;gt; max_faults) {
            max_faults = faults;
            max_nid = nid;
        }

		/* 4. numa_group이 있으면 그룹 폴트도 EMA 갱신 */
        ng = deref_curr_numa_group(p);
        if (ng) {
            /* 그룹의 faults[]도 같은 EMA 방식으로 갱신 */
            update_numa_group_faults(ng, nid);
        }
    }

	/* 5. 스캔 주기 적응
     *    로컬 폴트 비율이 높으면 &amp;rarr; 주기 증가 (스캔 빈도 감소)
     *    리모트 폴트 비율이 높으면 &amp;rarr; 주기 감소 (더 자주 스캔) */
    update_task_scan_period(p, fault_types[0], fault_types[1]);

	/* 6. 선호 노드 갱신 &amp;mdash; 그룹 고려 */
    ng = deref_curr_numa_group(p);
    if (ng) {
        /* 그룹이 있으면 task_numa_find_cpu()로
         * 그룹 전체의 최적 배치 탐색 */
        nid = task_numa_find_cpu(p, max_nid);
    }

	/* 현재 노드와 다른 노드가 최적이면 선호 노드 변경 */
    if (max_nid != p-&amp;gt;numa_preferred_nid) {
        /* CFS 스케줄러가 다음 wake-up 시 이 노드를 선호 */
        sched_setnuma(p, max_nid);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #263238; color: #eeffff; text-align: start;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;&amp;nbsp; 10&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;행: numa_scan_seq는 mm_struct에 저장된 전역 시퀀스 번호입니다. &lt;/span&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;task_tick_numa&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;가 VMA 스캔을 완료할 때마다 증가합니다. &amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #c0d1e7;&quot;&gt;#운영체제&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;&amp;nbsp; 26&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;행: 지수 이동 평균&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;EMA&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;을 사용하여 오래된 폴트 데이터를 점진적으로 감쇠시킵니다. f_old&lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; buf로 최근 스캔 주기의 폴트에 &lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;50&lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;%&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; 가중치를 부여합니다.&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;&amp;nbsp; 29&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;행: &lt;/span&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;BUF&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;버퍼&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; 엔트리를 &lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;으로 초기화하여 다음 스캔 주기의 새로운 폴트 데이터를 수집할 준비를 합니다.&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;&amp;nbsp; 36&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;행: 모든 노드 중 가장 높은 폴트 카운트를 가진 노드&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;max_nid&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;가 태스크의 메모리가 가장 많이 집중된 노드입니다.&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;&amp;nbsp; 50&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;행: &lt;/span&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;update_task_scan_period&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;는 private&lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;shared 폴트 비율에 따라 스캔 주기를 동적으로 조정합니다. 지역성이 좋으면 불필요한 스캔을 줄이고&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; 나쁘면 더 자주 확인합니다.&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;&amp;nbsp; 56&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;행: &lt;/span&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;task_numa_find_cpu&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;는 대상 노드에서 현재 태스크와 교환&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;swap&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;할 수 있는 최적의 CPU&lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;태스크를 찾습니다. 교환 시 양쪽 태스크의 NUMA 지역성이 모두 개선되어야 합니다.&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;&amp;nbsp; 62&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;행: &lt;/span&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;sched_setnuma&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;는 p&lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;numa_preferred_nid를 갱신합니다. CFS의 &lt;/span&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;select_task_rq_fair&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;가 이 값을 참조하여 태스크를 해당 노드의 CPU에 배치합니다.&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;스코어&amp;nbsp;해석&lt;/span&gt;:&lt;/b&gt;&amp;nbsp;&lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;task_weight()&lt;/b&gt;&lt;/span&gt;는&amp;nbsp;1000&amp;nbsp;기준&amp;nbsp;점수입니다.&amp;nbsp;예를&amp;nbsp;들어&amp;nbsp;2-노드&amp;nbsp;시스템에서&amp;nbsp;태스크가&amp;nbsp;Node 0에&amp;nbsp;800, Node 1에&amp;nbsp;200의&amp;nbsp;&lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;task_weight&lt;/b&gt;&lt;/span&gt;를&amp;nbsp;가지면,&amp;nbsp;메모리&amp;nbsp;접근의&amp;nbsp;80%가&amp;nbsp;Node 0에&amp;nbsp;집중된&amp;nbsp;것입니다.&lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;&amp;nbsp;group_weight()&lt;/b&gt;&lt;/span&gt;도&amp;nbsp;같은방식으로&amp;nbsp;그룹&amp;nbsp;전체의&amp;nbsp;노드별&amp;nbsp;접근&amp;nbsp;비율을&amp;nbsp;나타냅니다.&amp;nbsp;스케줄러는&amp;nbsp;&lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;task_weight + group_weight&lt;/b&gt;&lt;/span&gt;를&amp;nbsp;종합하여&amp;nbsp;최적배치를&amp;nbsp;결정합니다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;task_numa_compare()&lt;/span&gt;:&lt;/b&gt;&amp;nbsp;&lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;task_numa_find_cpu()&amp;nbsp;&lt;/b&gt;&lt;/span&gt;내부에서&amp;nbsp;각&amp;nbsp;후보&amp;nbsp;CPU의&amp;nbsp;현재&amp;nbsp;태스크와&amp;nbsp;교환(swap)했을&amp;nbsp;때의이득을&amp;nbsp;평가합니다.&amp;nbsp;교환&amp;nbsp;전후의&amp;nbsp;&lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;task_weight + group_weight&lt;/b&gt;&lt;/span&gt;&amp;nbsp;합계를&amp;nbsp;비교하여,&amp;nbsp;양쪽&amp;nbsp;모두에게&amp;nbsp;이득이&amp;nbsp;있거나총합이&amp;nbsp;증가하는&amp;nbsp;경우에만&amp;nbsp;교환을&amp;nbsp;승인합니다.&amp;nbsp;이는&amp;nbsp;한&amp;nbsp;태스크의&amp;nbsp;지역성을&amp;nbsp;개선하기&amp;nbsp;위해&amp;nbsp;다른&amp;nbsp;태스크의지역성을&amp;nbsp;희생하는&amp;nbsp;것을&amp;nbsp;방지합니다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;border-left: #0B2161 10px solid; padding-right: 10px; border-bottom: #0B2161 2px solid; pading-bottom: px; padding-top: 0px; margin: 10px 0px 5px; line-height: 30px;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;b&gt;27. &amp;nbsp;Linux 6.12 ~ 6.19 NUMA 최신 동향&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;CXL&amp;nbsp;상용&amp;nbsp;제품군이&amp;nbsp;확대되면서&amp;nbsp;NUMA의&amp;nbsp;의미가&amp;nbsp;&quot;물리적으로&amp;nbsp;떨어진&amp;nbsp;소켓&quot;에서&amp;nbsp;&quot;다른&amp;nbsp;대역폭&amp;middot;지연&amp;nbsp;특성을가진&amp;nbsp;메모리&amp;nbsp;티어&quot;로&amp;nbsp;확장되었습니다.&amp;nbsp;이에&amp;nbsp;따라&amp;nbsp;Auto NUMA balancing, memory tiering, ACPI HMAT&amp;nbsp;기반노드&amp;nbsp;속성&amp;nbsp;해석, DAMON&amp;nbsp;기반&amp;nbsp;핫/콜드&amp;nbsp;이동이&amp;nbsp;2024-2025년에&amp;nbsp;빠르게&amp;nbsp;통합되었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;color: #000000; text-align: start; border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; width=&quot;763&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style13&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;커널&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;릴리스&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;NUMA&amp;nbsp;&lt;/b&gt;&lt;b&gt;주요 변경&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;실무 시사점&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;6.12 (LTS)&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;2024-11&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;WMARK_PROMO&amp;nbsp;워터마크가&amp;nbsp;/proc/zoneinfo에 노출&amp;nbsp;&amp;mdash; DRAM-CXL&amp;nbsp;간 승격/강등 기준을 시스템 단위로 관찰 가능, NUMA&amp;nbsp;노드별&amp;nbsp;folio&amp;nbsp;통계 세분화&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;CXL&amp;nbsp;메모리가 포함된 호스트의 티어링 품질을&amp;nbsp;zoneinfo만으로 가시화 가능&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;6.13&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;2025-01&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;numa_balancing&amp;nbsp;모드가&amp;nbsp;NUMA_BALANCING_MEMORY_TIERING&amp;nbsp;확장을 공식 튜너블로 정리, ACPI HMAT&amp;nbsp;기반&amp;nbsp;access attribute가sysfs&amp;nbsp;access0/1/에 표준화&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;콜드/핫 티어를 자동 이동하는 운영 스크립트가 배포 간 이식 가능&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;6.14&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;2025-03&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;메모리 핫플러그 기본&amp;nbsp;online&amp;nbsp;정책 빌드 시 선택 가능,&amp;nbsp;memhp_default_online_type&amp;nbsp;부팅 파라미터 정리&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;CXL&amp;nbsp;메모리 핫추가 시 자동&amp;nbsp;online_movable/online_kernel선택 가능&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;6.15&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;2025-05&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;DAMON&amp;nbsp;MIGRATE_HOT/MIGRATE_COLD&amp;nbsp;액션과&amp;nbsp;monitoring intervals auto-tuning이&amp;nbsp;NUMA&amp;nbsp;티어링과 결합,&amp;nbsp;sysfs&amp;nbsp;기반 다중 마이그레이션 타깃 기반 정책 실험&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;DAMON으로&amp;nbsp;&quot;핫은&amp;nbsp;DRAM,&amp;nbsp;콜드는&amp;nbsp;CXL&quot;을 선언적으로 지정하는 운영이 가능&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;6.16&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;2025-07&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;CXL 2.0/3.0 Dynamic Capacity Device(DCD)&amp;nbsp;운영 인터페이스, NUMA node distance&amp;nbsp;계산 정확도 향상,&amp;nbsp;numa_stat&amp;nbsp;카운터 확장&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;워크로드 단위로&amp;nbsp;CXL&amp;nbsp;풀을 동적으로 빌렸다 반납하는 멀티테넌트 배포가 실현 단계&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;6.17&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;2025-09&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;NUMA&amp;nbsp;노드별 선제적 회수(proactive reclaim)&amp;nbsp;인터페이스 추가&amp;mdash;&amp;nbsp;/sys/devices/system/node/nodeN/reclaim에&amp;nbsp;echo 512M swappiness=10 &amp;gt;&amp;nbsp;형식으로 노드 단위 회수 트리거 가능; NUMA&amp;nbsp;노드 알림자(notifier)&amp;nbsp;내부&amp;nbsp;API가 메모리&amp;nbsp;on/offline&amp;nbsp;알림자에서 분리 독립&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;CXL/PMem&amp;nbsp;혼합 시스템에서 특정 노드만 선택적으로 회수하는 운영 스크립트 작성 가능. cpuset&amp;nbsp;단일 노드 환경에서 불필요한&amp;nbsp;NUMA&amp;nbsp;밸런싱 오버헤드 방지&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;6.18&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;2025-11&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;NUMA&amp;nbsp;제약으로 인한&amp;nbsp;kswapd&amp;nbsp;스래싱 방지&amp;nbsp;&amp;mdash;&amp;nbsp;메모리 압박이 해소되거나 강등(demotion)&amp;nbsp;설정이 변경될 때&amp;nbsp;kswapd&amp;nbsp;재활성화 로직 개선; page_alloc&amp;nbsp;경로에서&amp;nbsp;NUMA&amp;nbsp;제약 하의 불필요한kswapd&amp;nbsp;트리거 감소&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;NUMA&amp;nbsp;제약 환경(cpuset&amp;nbsp;또는mbind BIND&amp;nbsp;정책)에서&amp;nbsp;kswapd의 불필요한 스왑(Swap)&amp;nbsp;폭풍(swap storm)&amp;nbsp;발생 빈도 감소&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;6.19&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;2026-02&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;kmalloc_large()의&amp;nbsp;NUMA&amp;nbsp;메모리 정책 무시 회귀 버그 수정&amp;mdash;&amp;nbsp;mm/slab_common.c의 정리 과정에서&amp;nbsp;large kmalloc&amp;nbsp;경로가&amp;nbsp;mempolicy를 무시하고 로컬 노드만 선호하는 문제 발생,&amp;nbsp;수정 커밋으로 재적용&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;대형 메모리 할당(kmalloc&amp;nbsp;4KB&amp;nbsp;이상)이&amp;nbsp;BIND/INTERLEAVE&amp;nbsp;정책을 올바르게 따르게 됨. AMD Threadripper&amp;nbsp;등 고코어 시스템에서 모듈 로딩 시간이 최대60%&amp;nbsp;늘어나는 증상 해소&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;핵심&lt;/b&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;b&gt;요약&lt;/b&gt;&lt;b&gt;:&lt;/b&gt;&amp;nbsp;(1) 6.12&amp;nbsp;이후&amp;nbsp;NUMA와&amp;nbsp;메모리&amp;nbsp;티어링은&amp;nbsp;동일한&amp;nbsp;인프라를&amp;nbsp;공유합니다. CPU-less&amp;nbsp;노드를&amp;nbsp;&quot;콜드티어&quot;로&amp;nbsp;쓰는&amp;nbsp;구성이&amp;nbsp;표준화되었습니다. (2)&amp;nbsp;numactl -H,&amp;nbsp;daxctl list,&amp;nbsp;cxl list를&amp;nbsp;함께&amp;nbsp;보는&amp;nbsp;것이&amp;nbsp;현실적&amp;nbsp;디버깅조합입니다. (3) DAMON&amp;middot;numa_balancing&amp;middot;사용자&amp;nbsp;정의&amp;nbsp;migration daemon을&amp;nbsp;동시에&amp;nbsp;켜면&amp;nbsp;정책&amp;nbsp;충돌이&amp;nbsp;발생하므로한&amp;nbsp;축을&amp;nbsp;주&amp;nbsp;컨트롤러로&amp;nbsp;지정하세요. (4) 6.17부터&amp;nbsp;/sys/devices/system/node/nodeN/reclaim으로&amp;nbsp;노드&amp;nbsp;단위&amp;nbsp;선제적회수가&amp;nbsp;가능합니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #c0d1e7;&quot;&gt;# 컴퓨터과학&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;border-left: #0B2161 10px solid; padding-right: 10px; border-bottom: #0B2161 2px solid; pading-bottom: px; padding-top: 0px; margin: 10px 0px 5px; line-height: 30px;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;b&gt;28. &amp;nbsp;참고자료&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; 28.1 &amp;nbsp;커널 문서&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;color: #e6edf3;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;a style=&quot;color: #333333;&quot; href=&quot;https://www.kernel.org/doc/html/latest/admin-guide/mm/numa_memory_policy.html&quot;&gt;NUMA Memory Policy&lt;/a&gt;&amp;nbsp;&amp;mdash; NUMA&amp;nbsp;메모리&amp;nbsp;정책&amp;nbsp;관리자&amp;nbsp;가이드입니다&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;color: #e6edf3;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;a style=&quot;color: #333333;&quot; href=&quot;https://www.kernel.org/doc/html/latest/mm/numa.html&quot;&gt;NUMA&lt;/a&gt;&amp;nbsp;&amp;mdash; NUMA&amp;nbsp;내부&amp;nbsp;구현&amp;nbsp;문서입니다&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;color: #e6edf3;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;a style=&quot;color: #333333;&quot; href=&quot;https://www.kernel.org/doc/html/latest/admin-guide/mm/numaperf.html&quot;&gt;NUMA Performance&lt;/a&gt;&amp;nbsp;&amp;mdash; NUMA&amp;nbsp;성능&amp;nbsp;측정&amp;nbsp;및&amp;nbsp;튜닝&amp;nbsp;문서입니다&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; 28.2 &amp;nbsp;Man 페이지&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;color: #e6edf3;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;a style=&quot;color: #333333;&quot; href=&quot;https://man7.org/linux/man-pages/man2/mbind.2.html&quot;&gt;mbind(2)&lt;/a&gt;&amp;nbsp;&amp;mdash;&amp;nbsp;메모리&amp;nbsp;영역에&amp;nbsp;NUMA&amp;nbsp;정책을&amp;nbsp;설정하는&amp;nbsp;시스템&amp;nbsp;콜입니다&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;color: #e6edf3;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;a style=&quot;color: #333333;&quot; href=&quot;https://man7.org/linux/man-pages/man2/set_mempolicy.2.html&quot;&gt;set_mempolicy(2)&lt;/a&gt;&amp;nbsp;&amp;mdash;&amp;nbsp;프로세스&amp;nbsp;기본&amp;nbsp;NUMA&amp;nbsp;메모리&amp;nbsp;정책을&amp;nbsp;설정합니다&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;color: #e6edf3;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;a style=&quot;color: #333333;&quot; href=&quot;https://man7.org/linux/man-pages/man7/numa.7.html&quot;&gt;numa(7)&lt;/a&gt;&amp;nbsp;&amp;mdash; NUMA&amp;nbsp;아키텍처&amp;nbsp;개요&amp;nbsp;man page입니다&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; 28.3 &amp;nbsp;LWN 기사&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;color: #e6edf3;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;a style=&quot;color: #333333;&quot; href=&quot;https://lwn.net/Articles/568870/&quot;&gt;NUMA scheduling progress&lt;/a&gt;&amp;nbsp;&amp;mdash; NUMA&amp;nbsp;인식&amp;nbsp;스케줄링&amp;nbsp;개선&amp;nbsp;진행&amp;nbsp;상황입니다&amp;nbsp;(2013)&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;color: #e6edf3;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;a style=&quot;color: #333333;&quot; href=&quot;https://lwn.net/Articles/486858/&quot;&gt;Automatic NUMA balancing&lt;/a&gt;&amp;nbsp;&amp;mdash;&amp;nbsp;자동&amp;nbsp;NUMA&amp;nbsp;밸런싱&amp;nbsp;메커니즘을&amp;nbsp;설명합니다&amp;nbsp;(2012)&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;color: #e6edf3;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;a style=&quot;color: #333333;&quot; href=&quot;https://lwn.net/Articles/893023/&quot;&gt;Memory tiering&lt;/a&gt;&amp;nbsp;&amp;mdash; CXL&amp;nbsp;기반&amp;nbsp;메모리&amp;nbsp;티어링과&amp;nbsp;NUMA의&amp;nbsp;관계를&amp;nbsp;다룹니다&amp;nbsp;(2022)&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;color: #e6edf3;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;a style=&quot;color: #333333;&quot; href=&quot;https://lwn.net/Articles/591995/&quot;&gt;NUMA in a day&lt;/a&gt;&amp;nbsp;&amp;mdash; NUMA&amp;nbsp;개념을&amp;nbsp;종합적으로&amp;nbsp;정리한&amp;nbsp;기사입니다&amp;nbsp;(2014)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; 28.4 &amp;nbsp;커널 소스 코드&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;color: #e6edf3;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;a style=&quot;color: #333333;&quot; href=&quot;https://elixir.bootlin.com/linux/latest/source/mm/mempolicy.c&quot;&gt;mm/mempolicy.c&lt;/a&gt;&amp;nbsp;&amp;mdash; NUMA&amp;nbsp;메모리&amp;nbsp;정책&amp;nbsp;구현입니다&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;color: #e6edf3;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;a style=&quot;color: #333333;&quot; href=&quot;https://elixir.bootlin.com/linux/latest/source/mm/migrate.c&quot;&gt;mm/migrate.c&lt;/a&gt;&amp;nbsp;&amp;mdash; NUMA&amp;nbsp;페이지&amp;nbsp;마이그레이션&amp;nbsp;구현입니다&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;color: #e6edf3;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;a style=&quot;color: #333333;&quot; href=&quot;https://elixir.bootlin.com/linux/latest/source/kernel/sched/fair.c&quot;&gt;kernel/sched/fair.c&lt;/a&gt;&amp;nbsp;&amp;mdash; CFS&amp;nbsp;스케줄러&amp;nbsp;내&amp;nbsp;NUMA&amp;nbsp;밸런싱&amp;nbsp;로직입니다&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;border-left: #0B2161 10px solid; padding-right: 10px; border-bottom: #0B2161 2px solid; pading-bottom: px; padding-top: 0px; margin: 10px 0px 5px; line-height: 30px;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;b&gt;# 관련 문서&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;NUMA와&amp;nbsp;관련된&amp;nbsp;다른&amp;nbsp;주제를&amp;nbsp;더&amp;nbsp;깊이&amp;nbsp;이해하고&amp;nbsp;싶다면&amp;nbsp;다음&amp;nbsp;문서를&amp;nbsp;참고하세요.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;# 분산 및 클라우드 컴퓨팅&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;color: #e6edf3;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;a style=&quot;color: #333333;&quot; href=&quot;https://www.minzkn.com/linuxkernel/pages/memory.html&quot;&gt;메모리&amp;nbsp;관리&amp;nbsp;개요&lt;/a&gt;&amp;nbsp;&amp;mdash; Buddy Allocator,&amp;nbsp;존&amp;nbsp;구조,&amp;nbsp;페이지&amp;nbsp;테이블(Page Table)&amp;nbsp;등&amp;nbsp;NUMA의&amp;nbsp;기반이&amp;nbsp;되는&amp;nbsp;메모리관리&amp;nbsp;기초&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;color: #e6edf3;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;a style=&quot;color: #333333;&quot; href=&quot;https://www.minzkn.com/linuxkernel/pages/memory.html&quot;&gt;메모리&amp;nbsp;관리&amp;nbsp;개요&lt;/a&gt;&amp;nbsp;&amp;mdash;&amp;nbsp;메모리&amp;nbsp;회수, OOM Killer,&amp;nbsp;메모리&amp;nbsp;핫플러그&amp;nbsp;등&amp;nbsp;NUMA&amp;nbsp;환경의&amp;nbsp;고급&amp;nbsp;메모리&amp;nbsp;관리&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;color: #e6edf3;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;a style=&quot;color: #333333;&quot; href=&quot;https://www.minzkn.com/linuxkernel/pages/cpu-topology.html&quot;&gt;CPU&amp;nbsp;토폴로지&lt;/a&gt;&amp;nbsp;&amp;mdash; AMD CCX/CCD, Intel Tile, ARM DynamIQ,&amp;nbsp;스케줄링&amp;nbsp;도메인&amp;nbsp;계층&amp;nbsp;등&amp;nbsp;NUMA&amp;nbsp;토폴로지의하드웨어&amp;nbsp;기반&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;color: #e6edf3;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;a style=&quot;color: #333333;&quot; href=&quot;https://www.minzkn.com/linuxkernel/pages/scheduler.html&quot;&gt;프로세스&amp;nbsp;스케줄러&lt;/a&gt;&amp;nbsp;&amp;mdash; CFS의&amp;nbsp;NUMA-aware&amp;nbsp;태스크&amp;nbsp;배치,&amp;nbsp;로드&amp;nbsp;밸런싱, wake_affine&amp;nbsp;등&amp;nbsp;스케줄링&amp;nbsp;관점&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;color: #e6edf3;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;a style=&quot;color: #333333;&quot; href=&quot;https://www.minzkn.com/linuxkernel/pages/cpu-cache.html&quot;&gt;CPU&amp;nbsp;캐시&lt;/a&gt;&amp;nbsp;&amp;mdash; L1/L2/L3&amp;nbsp;캐시&amp;nbsp;계층, false sharing,&amp;nbsp;캐시&amp;nbsp;라인(Cache Line)&amp;nbsp;정렬&amp;nbsp;등&amp;nbsp;NUMA&amp;nbsp;성능에&amp;nbsp;영향을&amp;nbsp;미치는&amp;nbsp;캐시&amp;nbsp;동작&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;color: #e6edf3;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;a style=&quot;color: #333333;&quot; href=&quot;https://www.minzkn.com/linuxkernel/pages/slab-allocator.html&quot;&gt;Slab&amp;nbsp;할당기&lt;/a&gt;&amp;nbsp;&amp;mdash; SLUB의&amp;nbsp;노드별&amp;nbsp;partial&amp;nbsp;리스트, per-CPU&amp;nbsp;캐시, kmalloc_node()&amp;nbsp;등&amp;nbsp;NUMA-aware slab&amp;nbsp;할당&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;color: #e6edf3;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;a style=&quot;color: #333333;&quot; href=&quot;https://www.minzkn.com/linuxkernel/pages/percpu.html&quot;&gt;Per-CPU&amp;nbsp;데이터&lt;/a&gt;&amp;nbsp;&amp;mdash; Per-CPU&amp;nbsp;변수의&amp;nbsp;NUMA-aware&amp;nbsp;메모리&amp;nbsp;배치와&amp;nbsp;pcpu_alloc()&amp;nbsp;메커니즘&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;color: #e6edf3;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;a style=&quot;color: #333333;&quot; href=&quot;https://www.minzkn.com/linuxkernel/pages/hugepages.html&quot;&gt;Huge Pages&lt;/a&gt;&amp;nbsp;&amp;mdash; HugeTLB&amp;nbsp;노드별&amp;nbsp;할당, THP와&amp;nbsp;NUMA balancing&amp;nbsp;연동, khugepaged의&amp;nbsp;노드&amp;nbsp;선택&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;color: #e6edf3;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;a style=&quot;color: #333333;&quot; href=&quot;https://www.minzkn.com/linuxkernel/pages/cpusets.html&quot;&gt;cpusets &amp;amp; CPU Isolation&lt;/a&gt;&amp;nbsp;&amp;mdash; cpuset.mems를&amp;nbsp;이용한&amp;nbsp;NUMA&amp;nbsp;노드&amp;nbsp;격리, isolcpus, nohz_full&amp;nbsp;조합&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;color: #e6edf3;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;a style=&quot;color: #333333;&quot; href=&quot;https://www.minzkn.com/linuxkernel/pages/cxl-memory.html&quot;&gt;CXL&amp;nbsp;메모리&lt;/a&gt;&amp;nbsp;&amp;mdash; CXL.mem/cache/io&amp;nbsp;프로토콜, Type1/2/3&amp;nbsp;장치,&amp;nbsp;메모리&amp;nbsp;티어링, Weighted Interleave&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;color: #e6edf3;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;a style=&quot;color: #333333;&quot; href=&quot;https://www.minzkn.com/linuxkernel/pages/hmm.html&quot;&gt;HMM (Heterogeneous Memory Management)&lt;/a&gt;&amp;nbsp;&amp;mdash; GPU/가속기와&amp;nbsp;&lt;a style=&quot;color: #333333;&quot; href=&quot;https://www.minzkn.com/linuxkernel/pages/numa.html&quot;&gt;&amp;nbsp;CPU&lt;/a&gt;&amp;nbsp;간&amp;nbsp;NUMA&amp;nbsp;토폴로지&amp;nbsp;확장, ZONE_DEVICE, migrate_vma&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;color: #e6edf3;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;a style=&quot;color: #333333;&quot; href=&quot;https://www.minzkn.com/linuxkernel/pages/database-kernel.html&quot;&gt;데이터베이스와&amp;nbsp;커널&lt;/a&gt;&amp;nbsp;&amp;mdash; DB tail latency와&amp;nbsp;NUMA&amp;nbsp;로컬리티, membind/interleave&amp;nbsp;실전&amp;nbsp;전략&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Contents&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;핵심 요약&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;단계별 이해&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;NUMA&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;탄생 배경과 기초 개념&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp;UMA&lt;/span&gt;에서&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;NUMA&lt;/span&gt;로&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;mdash;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;확장성 한계의 해결&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp;NUMA&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;핵심 용어 정리&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;로컬 메모리와 원격 메모리의 성능 차이&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp;NUMA&lt;/span&gt;가 성능에 영향을 미치는 상황&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;내 시스템&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;NUMA&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;현황 첫 진단&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;NUMA&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;하드웨어 토폴로지&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp;NUMA Ratio&lt;/span&gt;와 영향&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp;AMD EPYC NPS(Nodes Per Socket)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;토폴로지&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp;Intel SNC(Sub-NUMA Clustering)&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;ACPI&lt;/span&gt;를 통한&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;NUMA&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;토폴로지 검색&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp;SRAT (Static Resource Affinity Table)&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp;SLIT (System Locality Information Table)&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp;HMAT (Heterogeneous Memory Attribute Table)&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;토폴로지 확인 명령&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;커널 자료구조&lt;span&gt;: pglist_data&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp;Zonelist &amp;mdash;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;할당 폴백 순서&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;노드 통계 확인&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;NUMA&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;메모리 정책&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;정책 유형&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;정책 범위와 재바인딩&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;시스템 콜&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp;numactl&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;사용&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;커널 내부&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;NUMA&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;할당&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;API&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Automatic NUMA Balancing&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;동작 원리&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp;NUMA Hinting Fault&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;튜닝 파라미터&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;NUMA-aware&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;스케줄링&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;스케줄링 도메인 계층&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;태스크 선호 노드&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp;NUMA&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;그룹&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;페이지 마이그레이션&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;마이그레이션 흐름&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;마이그레이션 도구&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;NUMA-aware&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;서브시스템&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp;Slab&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;할당기&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;(SLUB)&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp;Per-CPU&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;변수와&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;NUMA&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;네트워크 스택&lt;span&gt;(Network Stack)&lt;/span&gt;과&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;NUMA&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;NUMA&lt;/span&gt;와 메모리 회수&lt;span&gt;(Memory Reclaim)&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp;Zone Reclaim Mode&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;NUMA-aware I/O&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp;NVMe&lt;/span&gt;와&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;NUMA&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;블록 장치&lt;span&gt;(Block Device)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;레이어와&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;NUMA&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;CXL&lt;/span&gt;과 이종&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;NUMA&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp;CXL&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;메모리 토폴로지&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp;Weighted Interleave (v6.9+)&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;메모리 티어링&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;(Memory Tiering)&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;가상화&lt;span&gt;(Virtualization)&lt;/span&gt;와&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;vNUMA&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;성능 분석과 최적화&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp;perf&lt;/span&gt;로&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;NUMA&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;분석&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp;numastat&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;분석&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;메모리 대역폭&lt;span&gt;/&lt;/span&gt;지연 측정 도구&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;최적화 패턴&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;커널 설정 종합&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;트러블슈팅&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;일반적인 문제와 해결&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;디버깅&lt;span&gt;(Debugging)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;명령 모음&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;흔한 실수와 안티패턴&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;코드 레벨 안티패턴&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;NUMA&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;초기화 흐름&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;NUMA&lt;/span&gt;와&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;cgroups&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;통합&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp;cpuset.mems &amp;mdash; NUMA&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;노드 제한&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp;Kubernetes NUMA-aware&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;스케줄링&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;NUMA&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;메모리 핫플러그&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;NUMA&lt;/span&gt;와&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Hugepage&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp;HugeTLB&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;노드별 할당&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp;THP(Transparent Huge Pages)&lt;/span&gt;와&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;NUMA&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;NUMA&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;배치 최적화 플레이북&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp;task_numa_fault() &amp;rarr; task_numa_placement()&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;체인&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp;struct numa_group&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;심층 분석&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;NUMA&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;페이지 마이그레이션 경로 분석&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;NUMA&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;메모리 정책 커널 경로&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;NUMA&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;스코어 계산과 노드 배치 최적화&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Linux 6.12 ~ 6.19 NUMA&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;최신 동향&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;참고자료&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;커널 문서&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp;Man&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;페이지&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp;LWN&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;기사&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;커널 소스 코드&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;관련 문서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Embedded : : Architecture/: : MM</category>
      <author>Jay.P Morgan</author>
      <guid isPermaLink="true">https://eartist.tistory.com/1323</guid>
      <comments>https://eartist.tistory.com/1323#entry1323comment</comments>
      <pubDate>Thu, 23 Jul 2026 16:34:39 +0900</pubDate>
    </item>
    <item>
      <title>AP-A2B-DSP</title>
      <link>https://eartist.tistory.com/1283</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;border-left: #0B2161 10px solid; padding-right: 10px; border-bottom: #0B2161 2px solid; pading-bottom: px; padding-top: 0px; margin: 10px 0px 5px; line-height: 30px;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;b&gt;1. AP-DSP 사에의 A2B Transceiver 2EA&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span data-index-in-node=&quot;19&quot; data-math=&quot;A^2B&quot;&gt;&lt;span&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;A&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;B&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;(Automotive Audio Bus)의 동작 원리 때문에 발생하는 물리적인 제약입니다.&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-path-to-node=&quot;1&quot; data-ke-size=&quot;size16&quot;&gt;이해를 돕기 위해 왜 2개가 필요한지, 그리고 전체 그림이 어떻게 그려지는지 쉽게 설명해 드릴게요.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1436&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bN4nUQ/dJMcajvuz54/r3Ki8uqf5z9yOkBc29OTwk/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bN4nUQ/dJMcajvuz54/r3Ki8uqf5z9yOkBc29OTwk/img.webp&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bN4nUQ/dJMcajvuz54/r3Ki8uqf5z9yOkBc29OTwk/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbN4nUQ%2FdJMcajvuz54%2Fr3Ki8uqf5z9yOkBc29OTwk%2Fimg.webp&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;610&quot; height=&quot;684&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1436&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; 1.&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;1 &amp;nbsp;왜 AD2428이 2개(혹은 그 이상) 필요할까?&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-path-to-node=&quot;3&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-path-to-node=&quot;4&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span data-index-in-node=&quot;0&quot; data-math=&quot;A^2B&quot;&gt;&lt;span&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;A&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;B&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;는 일반적인 오디오 인터페이스(I2S)를 '장거리 전송용 특수 신호'로 포장해서 보내는 일종의&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b data-index-in-node=&quot;57&quot; data-path-to-node=&quot;4&quot;&gt;모뎀&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;역할을 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,0,0&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;i.MX8MP 측:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;I2S 신호를&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span data-index-in-node=&quot;19&quot; data-math=&quot;A^2B&quot;&gt;&lt;span&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;A&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;B&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;신호로 바꿔서&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b data-index-in-node=&quot;32&quot; data-path-to-node=&quot;5,0,0&quot;&gt;내보낼&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;모뎀(AD2428)이 필요합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,1,0&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;EV-21569 측:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;들어온&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span data-index-in-node=&quot;16&quot; data-math=&quot;A^2B&quot;&gt;&lt;span&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;A&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;B&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;신호를 다시 I2S로 풀어서&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b data-index-in-node=&quot;37&quot; data-path-to-node=&quot;5,1,0&quot;&gt;해석할&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;모뎀(AD2428)이 필요합니다.&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-path-to-node=&quot;6&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-path-to-node=&quot;6&quot; data-ke-size=&quot;size16&quot;&gt;즉,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b data-index-in-node=&quot;3&quot; data-path-to-node=&quot;6&quot;&gt;[i.MX8MP] &amp;harr; [AD2428 #1]&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;lt;--- (&lt;span data-index-in-node=&quot;33&quot; data-math=&quot;A^2B&quot;&gt;&lt;span&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;A&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;B&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;케이블) ---&amp;gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b data-index-in-node=&quot;48&quot; data-path-to-node=&quot;6&quot;&gt;[AD2428 #2] &amp;harr; [EV-21569]&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;이런 구조가 되어야 합니다. 하나만 있다면 한쪽은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span data-index-in-node=&quot;101&quot; data-math=&quot;A^2B&quot;&gt;&lt;span&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;A&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;B&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;신호를 알아들을 장치가 없는 셈이 됩니다.&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-path-to-node=&quot;6&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-path-to-node=&quot;6&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; 1.&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;2 &amp;nbsp;전체 연결 구성도 (구축해야 할 모습)&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-path-to-node=&quot;8&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-path-to-node=&quot;9&quot; data-ke-size=&quot;size16&quot;&gt;전체 시스템은 아래와 같은 흐름으로 연결됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;10,0,0&quot;&gt;&amp;nbsp; (1) Main Node (Master):&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;i.MX8MP PEVK&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;i.MX8MP의 SAI(I2S) 핀들을 첫 번째 AD2428WD1BZ의 I2S 핀에 연결합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;이때 첫 번째 AD2428이&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b data-index-in-node=&quot;16&quot; data-path-to-node=&quot;10,0,1,1,0&quot;&gt;Master&lt;/b&gt;가 되어 전체 버스의 클록과 전원을 관리하게 설정합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;10,1,0&quot;&gt;&amp;nbsp; (2) Bus Cable:&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;두 개의 AD2428WD1BZ 보드 사이에 있는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b data-index-in-node=&quot;27&quot; data-path-to-node=&quot;10,1,1,0,0&quot;&gt;DuraClik(2핀) 커넥터&lt;/b&gt;를 한 쌍의 꼬임선(UTP 케이블)으로 연결합니다. 이 선 하나로 오디오, 제어 신호(I2C), 전원이 다 갑니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;10,2,0&quot;&gt;&amp;nbsp; (3) Sub Node (Slave):&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;EV-21569 EZ-KIT&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;두 번째 AD2428WD1BZ의 I2S 핀들을 EV-21569의 DAI 핀에 연결합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;이 노드는 Master로부터 클록을 받아 동작합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; 1.&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;3 &amp;nbsp;&quot;그럼 너무 복잡하고 비싼 거 아냐?&quot;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-path-to-node=&quot;12&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-path-to-node=&quot;13&quot; data-ke-size=&quot;size16&quot;&gt;사실 이 방식이 어려운 이유는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b data-index-in-node=&quot;17&quot; data-path-to-node=&quot;13&quot;&gt;평범한 개발 보드들&lt;/b&gt;을 억지로 연결하려다 보니 생기는 문제입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;14,0,0&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;원래 의도된 방식:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;ADI에서 나오는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b data-index-in-node=&quot;21&quot; data-path-to-node=&quot;14,0,0&quot;&gt;ADZS-A2B-EXPENDER&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;같은 확장 카드를 EV-21569에 꽂으면, 그 카드 안에 이미 AD2428 칩과 회로가 들어 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;14,1,0&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;현재 상황:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;지금은 범용 A2B 평가 보드(AD2428WD1BZ)를 가지고 계시기 때문에, 마치 조립 PC를 만들 듯이 와이어로 하나하나 노드를 구성해 주셔야 하는 상황입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; 1.&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;4 &amp;nbsp;해결을 위한 제언&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-path-to-node=&quot;15&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-path-to-node=&quot;16&quot; data-ke-size=&quot;size16&quot;&gt;만약 단순히&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b data-index-in-node=&quot;7&quot; data-path-to-node=&quot;16&quot;&gt;i.MX8MP와 EV-21569 간에 오디오를 주고받는 것&lt;/b&gt;이 목적이고,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span data-index-in-node=&quot;47&quot; data-math=&quot;A^2B&quot;&gt;&lt;span&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;A&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;B&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;기술 자체를 테스트하려는 게 아니라면&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b data-index-in-node=&quot;73&quot; data-path-to-node=&quot;16&quot;&gt;&lt;span data-index-in-node=&quot;73&quot; data-math=&quot;A^2B&quot;&gt;&lt;span&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;A&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;B&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;를 빼고 직접 I2S로 연결&lt;/b&gt;하는 것이 훨씬 쉽습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000; text-align: start;&quot; data-path-to-node=&quot;17&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;17,0,0&quot;&gt;직접 연결:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;i.MX8MP SAI &amp;harr; EV-21569 DAI (점퍼 와이어 4~5가닥으로 끝)&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;17,1,0&quot;&gt;A2B 연결:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;AD2428 보드 2개 + I2C 설정(SigmaStudio) + 전원 설계 (매우 복잡)&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-path-to-node=&quot;18&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;18&quot;&gt;&lt;span data-index-in-node=&quot;0&quot; data-math=&quot;A^2B&quot;&gt;&lt;span&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;A&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;B&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;를 반드시 써야 하는 상황(예: 차량용 오디오 네트워크 구현 등)인가요?&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;그렇다면 AD2428 보드는 최소 2개가 있어야 통신이 성립됩니다. 한 개만 있으시다면 추가 구매 혹은 다른 구성 방법을 고민해봐야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Embedded : : Architecture/: : Peripheral</category>
      <author>Jay.P Morgan</author>
      <guid isPermaLink="true">https://eartist.tistory.com/1283</guid>
      <comments>https://eartist.tistory.com/1283#entry1283comment</comments>
      <pubDate>Fri, 15 May 2026 16:31:14 +0900</pubDate>
    </item>
    <item>
      <title>빅데이터 분석기사와 AI</title>
      <link>https://eartist.tistory.com/1282</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;border-left: #0B2161 10px solid; padding-right: 10px; border-bottom: #0B2161 2px solid; pading-bottom: px; padding-top: 0px; margin: 10px 0px 5px; line-height: 30px;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;b&gt;1. &amp;nbsp;빅데이터 분석기사 개요&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-path-to-node=&quot;1&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;1&quot;&gt;빅데이터 분석기사&lt;/b&gt;는 국가기술자격법에 따라 시행되는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b data-index-in-node=&quot;28&quot; data-path-to-node=&quot;1&quot;&gt;국가기술자격&lt;/b&gt;으로, 방대한 양의 데이터에서 가치를 추출하고 분석하는 능력을 검증하는 시험입니다. 데이터 수집, 저장, 처리부터 시각화 및 모델링까지 데이터 분석의 전 과정을 아우르는 전문가를 양성하기 위해 도입되었습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-11 오후 12.06.26.png&quot; data-origin-width=&quot;746&quot; data-origin-height=&quot;1018&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhEWXr/dJMcagyFQcf/KbfgHopugJB9ANzScgqAdK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhEWXr/dJMcagyFQcf/KbfgHopugJB9ANzScgqAdK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhEWXr/dJMcagyFQcf/KbfgHopugJB9ANzScgqAdK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhEWXr%2FdJMcagyFQcf%2FKbfgHopugJB9ANzScgqAdK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;309&quot; height=&quot;422&quot; data-filename=&quot;스크린샷 2026-05-11 오후 12.06.26.png&quot; data-origin-width=&quot;746&quot; data-origin-height=&quot;1018&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; 1. &amp;nbsp;주요 수행 직무&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-path-to-node=&quot;1&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-path-to-node=&quot;4&quot; data-ke-size=&quot;size16&quot;&gt;이 자격을 취득하면 데이터 사이언티스트나 데이터 분석가로서 다음과 같은 핵심 역할을 수행할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,0,0&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;데이터 수집 및 전처리:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;정형/비정형 데이터를 수집하고, 분석에 적합하게 데이터를 정제 및 가공합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,1,0&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;데이터 탐색 및 모형 구축:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;통계 기법과 머신러닝 알고리즘을 활용해 데이터를 분석하고 예측 모델을 만듭니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,2,0&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;결과 해석 및 시각화:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;분석 결과를 비즈니스 언어로 해석하고 시각화 도구를 통해 효과적으로 전달합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; 1.2 &amp;nbsp;시험 과목 및 방법&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-path-to-node=&quot;8&quot; data-ke-size=&quot;size16&quot;&gt;시험은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b data-index-in-node=&quot;4&quot; data-path-to-node=&quot;8&quot;&gt;필기&lt;/b&gt;와&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b data-index-in-node=&quot;8&quot; data-path-to-node=&quot;8&quot;&gt;실기&lt;/b&gt;로 나뉘어 진행됩니다.&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-path-to-node=&quot;8&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-path-to-node=&quot;9&quot; data-ke-size=&quot;size18&quot;&gt;■ 필기 시험 (객관식)&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-path-to-node=&quot;10&quot; data-ke-size=&quot;size16&quot;&gt;필기는 총 4개 과목으로 구성되며, 각 과목당 20문항씩 출제됩니다.&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-path-to-node=&quot;10&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11,0,0&quot;&gt;&amp;nbsp; 1. 빅데이터 분석 기획:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;분석 방안 수립, 데이터 수집 및 저장 계획.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11,1,0&quot;&gt;&amp;nbsp; 2. 빅데이터 탐색:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;데이터 전처리, 데이터 탐색, 통계 기법.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11,2,0&quot;&gt;&amp;nbsp; 3. 빅데이터 모델링:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;분석 모형 설계, 분석 기법 적용(머신러닝 등).&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11,3,0&quot;&gt;&amp;nbsp; 4. 빅데이터 결과 해석:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;모형 평가 및 개선, 분석 결과 시각화.&lt;/p&gt;
&lt;blockquote style=&quot;color: #000000; text-align: start;&quot; data-path-to-node=&quot;12&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-path-to-node=&quot;12,0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;12,0&quot;&gt;합격 기준:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;전 과목 평균 60점 이상 (단, 과목당 40점 미만 시 과락)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-path-to-node=&quot;13&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-path-to-node=&quot;13&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-path-to-node=&quot;13&quot; data-ke-size=&quot;size18&quot;&gt;■ 실기 시험 (작업형)&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-path-to-node=&quot;14&quot; data-ke-size=&quot;size16&quot;&gt;실기 시험은 실제 클라우드 환경에서 코딩을 통해 데이터를 분석하는 능력을 평가합니다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b data-index-in-node=&quot;48&quot; data-path-to-node=&quot;14&quot;&gt;Python&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;또는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b data-index-in-node=&quot;58&quot; data-path-to-node=&quot;14&quot;&gt;R&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;중 하나를 선택하여 응시할 수 있습니다.&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-path-to-node=&quot;14&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;15,0,0&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;작업형 제1유형:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;데이터 전처리 및 간단한 통계값 산출.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;15,1,0&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;작업형 제2유형:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;분류(Classification) 또는 회귀(Regression) 모델링 및 결과 도출.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;15,2,0&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;작업형 제3유형:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;가설 검정 등 통계적 분석 역량 평가.&lt;/p&gt;
&lt;blockquote style=&quot;color: #000000; text-align: start;&quot; data-path-to-node=&quot;16&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-path-to-node=&quot;16,0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;16,0&quot;&gt;합격 기준:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;100점 만점 기준 60점 이상&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; 1.3 &amp;nbsp;응시 자격 및 가치&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-path-to-node=&quot;19&quot; data-ke-size=&quot;size16&quot;&gt;국가기술자격인 만큼 일정한 요건을 갖춰야 응시할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;20,0,0&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;학력:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;4년제 대학 졸업(예정)자 또는 전공 불문 학위 취득자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;20,1,0&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;경력:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;기사 수준의 실무 경력 4년 이상 보유자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-path-to-node=&quot;21&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;21&quot;&gt;취득 시 장점:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;데이터 기반 의사결정이 중요해진 현대 비즈니스 환경에서 IT 기업, 금융권, 제조, 공공기관 등 다양한 산업군으로의 취업 및 이직 시 강력한 증빙 자료로 활용됩니다. 특히 공공기관 채용이나 승진 시 가산점을 받을 수 있는 공식적인 지표가 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; 1.4 &amp;nbsp;학습 팁&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000; text-align: start;&quot; data-path-to-node=&quot;24&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;24,0,0&quot;&gt;필기:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;통계학의 기본 개념(가설 검정, 회귀 분석 등)과 머신러닝 알고리즘의 원리를 이해하는 것이 중요합니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;24,1,0&quot;&gt;실기:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;특정 라이브러리(Pandas, Scikit-learn 등)를 활용해 데이터를 능숙하게 다루는 연습이 필수입니다. 특히 시험 환경이 평소 사용하는 IDE와 다를 수 있으므로 미리 체험 환경을 익혀두는 것이 좋습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-path-to-node=&quot;25&quot; data-ke-size=&quot;size16&quot;&gt;데이터 분석 역량을 증명하고 전문성을 키우고 싶으시다면 도전해 볼 만한 가치가 충분한 자격증입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;border-left: #0B2161 10px solid; padding-right: 10px; border-bottom: #0B2161 2px solid; pading-bottom: px; padding-top: 0px; margin: 10px 0px 5px; line-height: 30px;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;b&gt;2. &amp;nbsp;빅데이터 분석기사와 인공지능(AI) 대학원&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;빅데이터 분석기사 자격증 취득 과정에서 배우는 내용은 인공지능(AI) 대학원 진학 및 연구를 위한&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b data-index-in-node=&quot;55&quot; data-path-to-node=&quot;0&quot;&gt;기초 체력&lt;/b&gt;을 기르는 데 상당히 도움이 됩니다. 다만, 자격증 취득 그 자체가 합격의 '치트키'가 되기보다는, 그 과정을 통해 얻는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b data-index-in-node=&quot;128&quot; data-path-to-node=&quot;0&quot;&gt;기초 지식의 체계화&lt;/b&gt;에 의미를 두는 것이 좋습니다.&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-path-to-node=&quot;1&quot; data-ke-size=&quot;size16&quot;&gt;구체적으로 어떤 부분에서 도움이 되는지 정리해 드릴게요.&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-path-to-node=&quot;1&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; 2.1 &amp;nbsp;통계적 기초와 데이터 리터러시 (필기 과목 관련)&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-path-to-node=&quot;1&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-path-to-node=&quot;4&quot; data-ke-size=&quot;size16&quot;&gt;AI 대학원의 핵심은 결국 수학과 통계입니다. 빅데이터 분석기사 필기 과목에는 가설 검정, 회귀 분석, 확률 분포 등&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b data-index-in-node=&quot;66&quot; data-path-to-node=&quot;4&quot;&gt;기초 통계학&lt;/b&gt;이 비중 있게 포함되어 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,0,0&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;이점:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;대학원 면접(구술 고사)에서 기초 통계 지식을 묻는 경우가 많은데, 자격증 공부를 통해 이를 체계적으로 정리할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,1,0&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;연계성:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;딥러닝 모델의 손실 함수나 최적화 원리를 이해하기 위한 수치적 감각을 익히는 데 밑거름이 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; 2.2 &amp;nbsp;머신러닝 워크플로우의 이해&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-path-to-node=&quot;7&quot; data-ke-size=&quot;size16&quot;&gt;시험의 '빅데이터 모델링' 과목은 데이터 전처리부터 모델 선택, 학습, 평가까지의 전체 파이프라인을 다룹니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;8,0,0&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;이점:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;단순히 코드만 복사하는 것이 아니라,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b data-index-in-node=&quot;25&quot; data-path-to-node=&quot;8,0,0&quot;&gt;'왜 이 시점에서 스케일링을 해야 하는지', '왜 교차 검증(Cross-Validation)이 필요한지'&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;등의 방법론을 익히게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;8,1,0&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;실무적 도움:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;대학원 연구 시 데이터를 처음 마주했을 때 분석의 방향성을 잡는 훈련이 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; 2.&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;3 &amp;nbsp;Python/R 활용 능력 (실기 작업형 관련)&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-path-to-node=&quot;9&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-path-to-node=&quot;10&quot; data-ke-size=&quot;size16&quot;&gt;실기 시험은 Pandas, Scikit-learn 같은 핵심 라이브러리를 직접 다루어야 합니다.&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-path-to-node=&quot;10&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11,0,0&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;이점:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;데이터 프레임을 자유자재로 핸들링하는 능력은 AI 연구의 기본 중의 기본입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11,1,0&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;현실적 조언:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;대학원에서는 자격증 수준보다 훨씬 복잡하고 방대한 데이터를 다루지만, '작업형'을 통과할 수준의 코딩 실력은 연구를 시작하기 위한 최소한의 도구가 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;⚠️ 주의할 점 (현실적인 조언)&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-path-to-node=&quot;13&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;14,0,0&quot;&gt;&amp;nbsp; (1) 연구 역량 vs. 자격증:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;AI 대학원은 새로운 알고리즘을 제안하거나 문제를 해결하는 '연구 역량'을 중시합니다. 자격증은 &quot;이 친구가 기초는 되어 있구나&quot; 정도의 인상을 줄 뿐, 논문 실적이나 프로젝트 경험을 대체할 수는 없습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;14,1,0&quot;&gt;&amp;nbsp; (2) 수학적 깊이의 차이:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;빅데이터 분석기사는 계산 위주라면, 대학원은 수식의 증명과 유도 과정을 중요하게 봅니다. 자격증 공부와 병행하여 선형대수학, 미적분학을 따로 깊게 파는 것이 반드시 필요합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;결론&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-path-to-node=&quot;16&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-path-to-node=&quot;17&quot; data-ke-size=&quot;size16&quot;&gt;&quot;도움은 확실히 되지만, 그것만으로는 부족하다&quot;고 말씀드릴 수 있습니다.&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-path-to-node=&quot;17&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;18,0,0&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;비전공자/입문자라면:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;전체적인 AI/데이터 분석의 숲을 보는 용도로 강력 추천합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;18,1,0&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;전공자라면:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;이미 아는 내용을 복습하는 정도일 수 있으므로, 자격증 취득에 너무 많은 시간을 쏟기보다는 관심 있는 분야의 논문을 읽거나 관련 프로젝트(Kaggle 등)를 병행하는 것을 권장합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>AI : : ML-DL : : Data Science/: : Bigdata Analyisis</category>
      <author>Jay.P Morgan</author>
      <guid isPermaLink="true">https://eartist.tistory.com/1282</guid>
      <comments>https://eartist.tistory.com/1282#entry1282comment</comments>
      <pubDate>Mon, 11 May 2026 12:07:33 +0900</pubDate>
    </item>
    <item>
      <title>I2S (Inter-IC Sound)</title>
      <link>https://eartist.tistory.com/1281</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;border-left: #0B2161 10px solid; padding-right: 10px; border-bottom: #0B2161 2px solid; pading-bottom: px; padding-top: 0px; margin: 10px 0px 5px; line-height: 30px;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;b&gt;◈ &amp;nbsp;I2S (Inter-IC Sound)&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; I2S(Inter-IC Sound)는 디지털 오디오 장치 간에 데이터를 전송하기 위해 설계된 직렬 인터페이스 표준입니다. 필립스에서 제정했으며, 주로 MCU, DSP, 오디오 코덱, DAC/ADC 사이에서 무손실 오디오 데이터를 주고받을 때 사용하는 버스입니다.&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-path-to-node=&quot;1&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; I2S의 핵심은 데이터(Data)와 클록(Clock)을 분리하여 전송함으로써, 신호의 시간적 오차인 지터(Jitter)를 최소화한다는 점입니다.&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-path-to-node=&quot;1&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; 1. &amp;nbsp;I2S의 3대 핵심 신호라인&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-path-to-node=&quot;4&quot; data-ke-size=&quot;size16&quot;&gt;I2S는 최소 3개의 선으로 구성됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,0,0&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;SCK (Serial Clock):&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;비트 클록(BCLK)이라고도 하며, 데이터의 각 비트가 전송되는 타이밍을 결정합니다(동기식 통신에 사용).&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,1,0&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;WS (Word Select):&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;좌/우 채널을 구분하는 신호입니다. (FS-Frame Select, LRCK라고도 부름)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;-&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;Low (0)일 때는 왼쪽 채널,&lt;span&gt;&amp;nbsp;&lt;/span&gt;High (1)일 때는 오른쪽 채널 데이터를 전송하는 것이 표준입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp;-&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;좌우 채널은 일정한 주기로 반복이 되기 때문에 클럭으로 표기하기도 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,2,0&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;SD (Serial Data):&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;실제 오디오 데이터가 전송되는 라인입니다. (SDATA, SDINT, SDOUT으로 표시)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp;-&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;2의 보수(2's complement) 형태의 MSB부터 순차적으로 전송됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1493&quot; data-origin-height=&quot;580&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NgzSm/dJMcaa6iH1c/6auaNNBkD2kXRFIff8yXpK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NgzSm/dJMcaa6iH1c/6auaNNBkD2kXRFIff8yXpK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NgzSm/dJMcaa6iH1c/6auaNNBkD2kXRFIff8yXpK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNgzSm%2FdJMcaa6iH1c%2F6auaNNBkD2kXRFIff8yXpK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;582&quot; height=&quot;226&quot; data-origin-width=&quot;1493&quot; data-origin-height=&quot;580&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;773&quot; data-origin-height=&quot;266&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lej2F/dJMcaf7zhff/nM9v5j9zs5Uc3hDCGZWRXk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lej2F/dJMcaf7zhff/nM9v5j9zs5Uc3hDCGZWRXk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lej2F/dJMcaf7zhff/nM9v5j9zs5Uc3hDCGZWRXk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Flej2F%2FdJMcaf7zhff%2FnM9v5j9zs5Uc3hDCGZWRXk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;642&quot; height=&quot;221&quot; data-origin-width=&quot;773&quot; data-origin-height=&quot;266&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;SE-43ddde5a-8f8c-430c-876d-b58d5d3f8fe2&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;​&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&amp;nbsp; 네 번째 라인, 마스터 클럭&lt;/b&gt;&lt;/p&gt;
&lt;p id=&quot;SE-c2d58608-91fd-4883-840c-d850f48617b8&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; I2S규격에는 포함되어 있지 않지만, 실제 제품에서 흔히 사용되는 네번째 라인이 있습니다. 마스터 클럭이라고 불리는 신호선으로 좌우 채널 선택 클럭(LRCLK)의 256배에 해당하는 클럭을 사용합니다. 오디오 집적 회로는 이 신호에 동기화하여 작동합니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 원래 IC들은 내부에 OSC를 갖고 있는데, 별도로 외부의 클럭을 사용하는 것은 전송되는 데이터가 오디오라는 특수성 때문입니다. 오디오 데이터는 끊김이 없이 일정한 속도로 흘러 가야 하며, 만약 그렇지 못하면 스피커를 통해서 재생되는 중, 소리가 끊기거나 튀는 소리 등, 비정상적인 소리가 발생할 수 있기 때문입니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 이러한 현상을 방지하기 위해서 시스템 내부의 모든 부품이 일사 분란하게 동작하여야 하며, 전투선의 북소리와 같은 역할을 마스터 클럭이 담당하게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; 2. &amp;nbsp;주요 동작 특성&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;8,0,0&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;마스터와 슬레이브:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;통신을 제어하는 장치(주로 MCU나 DSP)가 클록(SCK, WS)을 생성하는 마스터가 되고, 데이터를 받는 쪽(DAC 등)이 슬레이브가 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;8,1,0&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;데이터 정렬 (Alignment):&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;표준 I2S 방식에서는 WS 신호가 변한 뒤&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b data-index-in-node=&quot;45&quot; data-path-to-node=&quot;8,1,0&quot;&gt;한 클록 뒤에&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;실제 데이터 비트가 시작됩니다. (이 외에도 Left-Justified, Right-Justified 등의 변형 포맷이 있습니다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;8,2,0&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;동기화:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;클록이 데이터와 별도로 존재하기 때문에 송수신 장치 간에 별도의 복잡한 동기화 과정 없이도 정확한 오디오 재생이 가능합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; 3. &amp;nbsp;I2S&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;I2S 기술의 세부사항&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&amp;nbsp; (1) 네트워크 구성&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&amp;nbsp; &amp;nbsp; I2S는 버스 구조를 갖기 때문에 여러 대의 장치를 연결할 수 있다. 오디오 신호를 전송하는 기기(트랜스미터, Transmitter)와 오디오 신호를 수신하는 기기(리시버, Receiver)외에 마스터 클럭을 제공하는 기기(컨트롤러, Controller)가 연결될 수 있고, 또는 오디오 신호를 외부로부터 받아들일 수 있는 마이크 장치가 버스에 연결될 수 있다. 일반적으로 트랜스미터는 CPU, 혹은 마이크로 프로세서에 해당하고, 리시버는 디지털 신호를 아날로그 신호로 변환하여 스피커로 보내 주는 오디오 장치에 해당한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&amp;nbsp; &amp;nbsp; 마스터 클럭을 제공하는 컨트롤러는 별도로 존재할 수도 있고, 트랜스미터나 리시버가 그 역할을 겸할 수도 있다. 이 경우에는 네트워크가 일대일 구성을 이루게 된다.&lt;/span&gt;&lt;/p&gt;
&lt;div id=&quot;SE-d3bd097e-1b49-4220-a93b-472da7012589&quot; style=&quot;color: #8a837e; text-align: left;&quot;&gt;
&lt;p id=&quot;SE-aecc118a-6c55-4a95-bd58-456f4af040f6&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-10ed490b-667c-41a8-8710-8311a52ac1fb&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-fdacc285-df06-4637-8784-56268aca4692&quot; style=&quot;color: #8a837e; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;773&quot; data-origin-height=&quot;198&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Lf0xc/dJMcadPpAmm/4LSxyojkG8q4Mk2Ty5MBgk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Lf0xc/dJMcadPpAmm/4LSxyojkG8q4Mk2Ty5MBgk/img.png&quot; data-alt=&quot;[그림 2] I2S 네트워크 구성&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Lf0xc/dJMcadPpAmm/4LSxyojkG8q4Mk2Ty5MBgk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLf0xc%2FdJMcadPpAmm%2F4LSxyojkG8q4Mk2Ty5MBgk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;711&quot; height=&quot;182&quot; data-origin-width=&quot;773&quot; data-origin-height=&quot;198&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 2] I2S 네트워크 구성&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-b551b4b0-d3cd-4d5e-84c3-7f56f39badee&quot; style=&quot;color: #8a837e; text-align: left;&quot;&gt;
&lt;p id=&quot;SE-c261bbaf-5b1a-48ec-9604-929110e73822&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;SE-301f6baf-0025-4b2c-aaa3-705956e7bc12&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-16ec2d87-6b2c-4822-ae53-7d0ae5e3dbe6&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; (2) 버전과 데이터의 전송 속도&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p id=&quot;SE-9795e41d-9103-48bc-8be6-ed2d2a1a4f3b&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-106ec213-29bf-4ca1-81fd-e95692a395ba&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp; 일반적인 데이터를 전송하는 UART, I2C, SPI와 달리 오디오 데이터를 전송하는 I2S는 전송하는 데이터가 어떻게 생성되었는지에 따라서 데이터의 전송 속도가 정해진다. &lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;I2S&lt;/span&gt;는 &lt;/b&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;디지털 오디오 데이터를 전송하는 커넥티비티&lt;/b&gt;이므로&lt;/span&gt;&lt;b&gt; 디지털 오디오 데이터가 어떠한 특성을 갖느냐가 중요&lt;/b&gt;&lt;/span&gt;하다. 예를 들어 디지털 오디오 데이터가 고음질이라면, 초당 전송해야 하는 데이터 양을 많아 질 것이고, 그렇다면 데이터의 전송 속도도 올라가야 한다. 반면, 저음질의 오디오 데이터라면, 초당 전송해야 하는 데이터 양은 적을 것이며, 그렇다면 데이터의 전송 속도는 낮아질 것이다. 이러한 현상은 &lt;span style=&quot;color: #409d00;&quot;&gt;&lt;b&gt;데이터의 전송과 스피커를 통한 출력이 동기화되어야 하기 때문에 발생&lt;/b&gt;&lt;/span&gt;한다. 아무리 빨리 데이터를 보낼 수 있다고 하더라도 스피커로 출력되는 데이터의 양을 이미 정해져 있기 때문이다. 반면, &lt;span style=&quot;color: #1b711d;&quot;&gt;&lt;b&gt;고음질의 데이터의 경우에는 한번에 스피커로 출력할 수 있는 데이터의 양이 많다는 것을 의미&lt;/b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;하는데,&lt;/span&gt;&lt;b&gt; 만약 충분한 커넥티비티가 데이터 전송 속도를 갖지 못한다면, 스피커에서는 계속해서 음이 끊기는 현상이 나타나게 될 것&lt;/b&gt;&lt;/span&gt;이다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-47422e8c-f909-47b7-8c0b-02a2d0c795a9&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-a869fdd2-369c-4c47-bf30-fc6f3abdd921&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; 구체적으로 데이터의 전송 속도를 결정짓는 디지털 오디오의 특성은 다음과 같은 두 가지 요소가 중요한데, 첫째는 &lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;샘플링 레이트(sampling rate)&lt;/b&gt;&lt;/span&gt;이고, 둘째는 &lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;비트 깊이(bit depth)&lt;/b&gt;&lt;/span&gt;이다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #333333; letter-spacing: 0px;&quot;&gt;&amp;nbsp;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;I2S&lt;/b&gt;&lt;/span&gt;는 오디오 신호를 전송하는 것이므로, &lt;b&gt;스피커를 통해서 &lt;span style=&quot;color: #ef5369;&quot;&gt;소리가 출력되는 속도와 동일한 속도로 데이터의 전송이 이루어져야 한다&lt;/span&gt;.&lt;/b&gt; 더 빨라도 안 되고, 더 늦어도 안된다. 마스터 클럭을 통해서 데이터의 전송 속도와 오디오 집적 회로의 동작 클럭을 일치시키는 것도 이러한 이유 때문이다.&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;
&lt;p id=&quot;SE-22ea5d3b-528c-450b-8517-8ff6258d87da&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-cc6fb4f8-9d64-46dd-a433-526de633210a&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; 먼저, CD 의 음원을 전송하는 경우이다. 샘플링 레이트가 44.1kHz 이므로, 초당 44100번의 샘플링이 있었으며, 샘플링된 신호는 16비트로 양자화되었으므로 1초에 전송해야 할 데이터는 44100 x 16 비트 = 705,600 비트이다. 이것은 모노(mono)인 경우이다. 만약 스테레오의 경우라면 왼쪽과 오른쪽 마이크를 통해서 샘플링된 신호가 각각 존재하므로, 1초에 전송해야 할 데이터는 모노의 2배에 해당하므로 44100 x 16비트 x 2 채널 = 1,411,200 비트가 된다. 즉, CD음원을 전송하는 경우 I2S의 데이터 전송 속도는 1.411 Mbits/s가 된다. 이런 식으로 전송하는 오디오 음원의 제작 방법에 따라서 I2S의 데이터 전송 속도는 달라지게 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-3ea63e29-cacc-4c18-8c5f-6d928f876ec0&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 id=&quot;SE-359d02db-db76-49aa-8a08-e9047b840e30&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;기술의 동작&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p id=&quot;SE-aad25fde-d5ac-4c49-8120-3a49a3cc82db&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-e9325744-af99-4076-af44-c149c0053f08&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; (1) 데이터의 전송&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p id=&quot;SE-20b948b2-2ec1-46a1-acd9-cedaba808062&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-7cb62794-4fb9-48fb-9cd7-25ba97ae430a&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;b&gt;데이터의 전송&lt;/b&gt;을 위해서 &lt;b&gt;세 개의 라인을 통해서 동기화된 출력&lt;/b&gt;이 필요하다. 첫째는 &lt;span style=&quot;color: #409d00;&quot;&gt;&lt;b&gt;클럭 신호&lt;/b&gt;&lt;/span&gt;를 통해서, 오디오 데이터의 송신기와 수신기가 데이터를 주고 받기 위한 동기화를 하게 된다. 클럭 신호는 I2S 버스 시스템에 연결되어 있는 기기 중에서 한 곳에서 생성이 된다. 앞에서 설명한 것과 같이 클럭을 생성하는 장치를 마스터라고 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-506188f3-15c6-4271-9143-bdf33498848e&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-4cc2cc5f-1980-4495-88bf-82ce404ddf38&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp; 클럭은 32KHz, 44.1KHz, 48KHz 또는 이들의 배수에 해당하는 값을 사용한다. 이유는 이미 앞에서 설명한 것과 같이 전송되는 데이터가 오디오이므로, 스피커를 통해서 출력하는 속도와 같아야 한다. 32KHz, 44.1KHz, 48KHz는 일반적으로 디지털 오디오 음원에 사용되는 샘플링 레이트이다. CD 음원을 사용하는 경우라면, 음원의 샘플링 레이트가 44.1KHz 이고, 16비트로 구성되며, 왼쪽 스피커/오른쪽 스피커(L/R)신호로 구성이 되므로, 사용되는 클럭은 44.1KHz x 16 비트 x 2 채널= 1.4112MHz이다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-348f483b-601f-4f2a-a860-eef104547e20&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-cf0e4a84-288a-453f-888c-b7431995c769&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp; 둘째는 오디오가 스테레오의 경우라면, &lt;span style=&quot;color: #409d00;&quot;&gt;&lt;b&gt;좌우 채널 선택&lt;/b&gt;&lt;/span&gt;을 해주어야 한다. 즉, 현재 전송하고자 하는 오디오 신호가 왼쪽 채널인데, 오른쪽 채널인지를 리시버에게 알려주어야 한다. 그래야만 리시버는 자신에게 연결되어 있는 2개의 스피커 중 올바른 쪽으로 소리를 출력할 수 있다. 구체적으로 트랜스미터는 좌우 채널 선택 클럭 신호를 low신호로 바꾸고, 왼쪽 채널 신호를 전송한다. 그 다음 좌우 채널 선택 클럭 신호를 high신호로 바꾸고 오른쪽 채널 신호를 전송한다. 좌우 채널 선택은 일정한 주기로 반복이 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-bb5c9d88-7fba-47a7-a766-28718b640e70&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-f1ad869d-aa85-43b4-a62c-5fdf95230d8f&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp; 셋째는 오디오 데이터를 전송한다. &lt;span style=&quot;color: #409d00;&quot;&gt;&lt;b&gt;오디오 데이터의 길이는 앞에서 살펴 본 비트 깊이(bit depth)에 따라 다르다&lt;/b&gt;&lt;/span&gt;. 데이터의 길이는 28비트까지 조정이 가능하다. 아래의 그림은 16비트 길이의 경우와 24비트 길이의 경우를 예시하고 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-7837fd45-1b5f-4ba7-82da-f258517a6247&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;div id=&quot;SE-5845010c-3f54-4983-90d0-0f04b7e2c3cd&quot; style=&quot;color: #8a837e; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;245&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/baZXVz/dJMcaiiVNIT/0tOR1MMA9tFNxHUjqJKrrk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/baZXVz/dJMcaiiVNIT/0tOR1MMA9tFNxHUjqJKrrk/img.png&quot; data-alt=&quot;[그림 3] I2S의 데이터 전송 타이밍&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/baZXVz/dJMcaiiVNIT/0tOR1MMA9tFNxHUjqJKrrk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbaZXVz%2FdJMcaiiVNIT%2F0tOR1MMA9tFNxHUjqJKrrk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;566&quot; height=&quot;231&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;245&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 3] I2S의 데이터 전송 타이밍&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-ce8b0a81-2412-43f8-9aca-3ec68ebb356f&quot; style=&quot;color: #8a837e; text-align: left;&quot;&gt;
&lt;p id=&quot;SE-da1a7113-d77a-44a4-b453-66945d54a0b0&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;SE-b18541b2-f3b7-4878-903d-dce4d4a75ecd&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; (2) 데이터 프레임&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p id=&quot;SE-9292c27e-6a71-468c-80ba-5630dab416a7&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-58ad2069-54d8-4806-bb3a-ad919364e8ba&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp; I2S는 오디오 데이터의 전송이 목적이기 때문에 데이터 프레임이란 다름 아닌 오디오 데이터를 담기 위한 포맷이며, 왼쪽과 오른쪽 채널의 구분이 있으나, 데이터의 포맷은 동일하다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-c3ff9387-eec0-4407-9635-10bb5ade0f4a&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 id=&quot;SE-63d2cfcb-2204-49c8-8525-da29618ee997&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;기술의 구현&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p id=&quot;SE-a497ba72-afbf-4a3f-ab09-d8afff8b4a2c&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-a4609ca0-3373-4c5d-9a99-acbe03c15b9d&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; (1) 안드로이드에서의 I2S&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p id=&quot;SE-79ddc5e8-5e6c-4f13-935a-190e1a5fba2d&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-354332b6-432c-4b10-ae2a-75273caf855a&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp; 아래는 스마트 폰을 비롯하여 안드로이드가 탑재되는 기기에서 사용되는 I2S 버스 시스템의 일반적인 블록도이다. 전화 통화를 지원하기 위해서 기본적으로 마이크와 스피커가 탑재되어 있고, 마이크는 아날로그 신호를 디지털 신호로 변환하는 작업을 맡고, 스피커는 DAC(Digital Analog Converter)를 통해서 디지털 신호를 아날로그 신호로 변환한다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-f1419512-6a3c-4509-be1d-5b85b252558b&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-59b3e276-25e7-4568-a923-262304aeccb8&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-381357ff-971a-4669-9f74-fc806cab69c5&quot; style=&quot;color: #8a837e; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;773&quot; data-origin-height=&quot;325&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8bICj/dJMcaiiVNIU/7yaK9VqSm1jJkdgMAkKMT1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8bICj/dJMcaiiVNIU/7yaK9VqSm1jJkdgMAkKMT1/img.png&quot; data-alt=&quot;[그림 4] 안드로이드에서의 I2S 연결&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8bICj/dJMcaiiVNIU/7yaK9VqSm1jJkdgMAkKMT1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8bICj%2FdJMcaiiVNIU%2F7yaK9VqSm1jJkdgMAkKMT1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;659&quot; height=&quot;277&quot; data-origin-width=&quot;773&quot; data-origin-height=&quot;325&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 4] 안드로이드에서의 I2S 연결&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-809c31ba-059c-4595-938d-79b7280e9602&quot; style=&quot;color: #8a837e; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-3a411fb8-0f00-430e-babf-36d809139e51&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-e2aa6488-e233-443d-a1ec-ee5289b4d44e&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;아래의 소스 코드는 안드로이드에서 I2S 통신을 하기 위한 환경 설정 부분이다.&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-fdfc3e0f-6ec9-40d4-a26c-6bdf84c5b18d&quot; style=&quot;color: #8a837e; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;table style=&quot;text-align: left; border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;
&lt;div&gt;&lt;span style=&quot;color: #333333;&quot;&gt;private static final AudioFormat AUDIO_FORMAT_STEREO =&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #333333;&quot;&gt;new AudioFormat.Builder()&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #333333;&quot;&gt;​&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #333333;&quot;&gt;.setChannelMask(AudioFormat.CHANNEL_IN_STEREO) // 2 channels&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #333333;&quot;&gt;.setEncoding(AudioFormat.ENCODING_PCM_16BIT) // 16-bit samples&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #333333;&quot;&gt;.setSampleRate(44100) // 44.1kHz&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #333333;&quot;&gt;.build();&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-79b62d50-a857-4aef-9f4f-5b724c076f33&quot; style=&quot;color: #8a837e; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-e8fce3e7-ea99-4409-950b-a130e665ad4d&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-b518b3bc-dfb2-4c96-9e2b-e5baa5b6de5a&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; (2) TDM&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p id=&quot;SE-32a18964-60ae-4868-b0e1-1b5dde4f0b2e&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-11991057-82b5-4cd6-a9b5-bbde33e454d8&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp; I2S는 두 채널의 오디오 신호, 즉 왼쪽 스피커를 위한 채널과 오른쪽 스피커를 위한 채널를 전송하기 위한 규격이다. 그러나, 현실에서는 &lt;span style=&quot;color: #8a3db6;&quot;&gt;&lt;b&gt;훨씬 많은 채널을 전송해야 할 필요&lt;/b&gt;&lt;/span&gt;가 있다. 서라운드 효과를 위해서 기본적으로 5.1채널이 요구되며, 보다 실감나는 효과를 위해서 7.1 채널도 사용이 된다. 이들은 &lt;span style=&quot;color: #8a3db6;&quot;&gt;&lt;b&gt;왼쪽 스피커, 오른쪽 스피커 이외에도 후방의 좌우에 스피커를 각각 배치하며, 전방의 좌우 스피커에 사이에 센터 스피커를 배치&lt;/b&gt;&lt;/span&gt;한다. 그리고, &lt;span style=&quot;color: #8a3db6;&quot;&gt;&lt;b&gt;서브 우퍼&lt;/b&gt;&lt;/span&gt;가 연결이 된다. 이렇게 설치되어 있는 모든 스피커들에게 동일한 타이밍으로 오디오 신호를 전송해야만 올바른 소리를 들을 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-065a1ff9-bf77-4aee-be0b-9195201eef81&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-62218a7f-0fa5-492e-b0e6-f818c38fd85b&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp; 이 문제를 해결하기 위해서 I2S규격과 유사한 방식을 사용하는데, 이러한 방식을 TDM(Time Division Multiplexed)라고 한다. 이름에서도 짐작할 수 있듯이, 하나의 물리 채널을 이용하여 여러 개의 오디오 채널을 전송하기 위해, 각각의 오디오 채널에게 일정한 간격으로 시간을 할당하는 방식이다. I2S도 좌우 채널이 일정한 간격으로 각자의 오디오 신호를 전송하므로, TDM방식이라고 볼 수 있다. 다만, I2S는 단 2개의 오디오 채널만 사용되므로 5.1채널의 6채널보다 시간적으로 여유롭게 물리 채널을 사용할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-5388af36-5d85-4c75-9a84-671391125ebd&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-f8049352-89db-45ad-a36a-f626590696ba&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;u&gt;TDM은 표준규격이 존재하지 않는다.&lt;/u&gt; 따라서 제조업체에 따라서 다양한 형태로 구현이 된다. 그러나, 기본적인 동작 방식은 거의 동일하다. I2S와 같이 &lt;u&gt;데이터 전송을 위한 연결 라인, 동기 신호를 보내는 클럭 라인, 그리고, 프레임 동기화 신호를 전송하는 라인으로 구성&lt;/u&gt;이 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-a8d4b5e7-3146-46e9-83bd-fb8238ca87ca&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; 4. &amp;nbsp;I2S &amp;nbsp;vs. &amp;nbsp;다른 인터페이스&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11,0,0&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;I2C/SPI와의 차이:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;I2C나 SPI는 일반적인 데이터를 주고받는 데 최적화되어 있지만, I2S는 실시간 오디오 스트리밍에 최적화되어 오디오 샘플링 레이트에 맞춘 정밀한 타이밍 제어가 가능합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&amp;nbsp; I2C와 I2S&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot;&gt;&lt;b data-path-to-node=&quot;11,0,0&quot; data-index-in-node=&quot;0&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11,0,0&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;연결&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11,0,0&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/b&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11,0,0&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;-&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/b&gt;I2C는 독자적으로 사용 가능&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11,0,0&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/b&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11,0,0&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;-&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/b&gt;I2S는 환경 설정을 해 줄 별도의 커넥비티비가 필요&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot;&gt;하고, 일반적으로 I2C가 그 역할을 담당&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11,0,0&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/b&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11,0,0&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;-&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/b&gt; 따라서, 일반적으로 오디오 데이터를 전송하는 I2S와 일반 데이터를 전송하는 I2C가 쌍을 이루어서 제품에서 사용&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot;&gt;&lt;b data-path-to-node=&quot;11,0,0&quot; data-index-in-node=&quot;0&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/b&gt;마스터 정의&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot;&gt; &lt;b data-path-to-node=&quot;11,0,0&quot; data-index-in-node=&quot;0&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/b&gt;&lt;b data-path-to-node=&quot;11,0,0&quot; data-index-in-node=&quot;0&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt; &lt;/span&gt;-&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/b&gt;I2C에서는 데이터 전송을 시작할 수 있으면 마스터라고 부르지만, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11,0,0&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/b&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11,0,0&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;-&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/b&gt;I2S에서는 클럭을 내보는 역할을 담당하는 기기를 마스터라고 부른다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11,0,0&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/b&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11,0,0&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;-&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/b&gt;I2S에서는 슬레이브라는 개념은 없으며, 데이터를 보내는 트랜스미터(Transmitter)와 데이터를 받는 리시버(receiver)가 있다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;Duflex&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot;&gt;&lt;b data-path-to-node=&quot;11,0,0&quot; data-index-in-node=&quot;0&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/b&gt;&lt;b data-path-to-node=&quot;11,0,0&quot; data-index-in-node=&quot;0&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;-&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/b&gt;I2C는 데이터가 양방향으로 이동할 수 있는 반이중모드가 가능하지만, I2S는 단방향 통신만 가능하다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11,1,0&quot;&gt;&amp;nbsp; PCM/TDM&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;I2S는 기본적으로 2채널(스테레오)을 지원합니다. 만약 8채널 이상의 다채널 오디오가 필요하다면 I2S를 확장한&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b data-index-in-node=&quot;73&quot; data-path-to-node=&quot;11,1,0&quot;&gt;TDM(Time Division Multiplexing)&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;방식을 사용하게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; 5. &amp;nbsp;하드웨어 설계 시 고려사항&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-path-to-node=&quot;14&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 실제 임베디드 시스템이나 하드웨어를 설계할 때 I2S와 관련하여 자주 언급되는 추가 신호가 있습니다.&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-path-to-node=&quot;14&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;15,0,0&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;MCLK (Master Clock):&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;I2S 표준 자체에는 포함되지 않으나, 오디오 코덱이나 DAC가 내부 연산을 위해 I2S 클록보다 훨씬 빠른(예: 256 x fs) 시스템 클록을 요구할 때 사용됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;15,1,0&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;신호 무결성:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;고속 디지털 신호이므로 라인 길이가 길어지면 노이즈나 반사가 발생할 수 있어, 보통 수 cm 이내의 짧은 거리에서 연결하거나 적절한 터미네이션 저항을 배치합니다.&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-path-to-node=&quot;16&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-path-to-node=&quot;16&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-path-to-node=&quot;16&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-path-to-node=&quot;16&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; I2S는 오늘날 블루투스 모듈, 오디오 앰프 설계, 하이파이(Hi-Fi) 오디오 시스템 등 디지털 음향이 들어가는 거의 모든 분야에서 표준으로 사용되고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고: &lt;a href=&quot;https://blog.naver.com/ittalentdonation/221194850771&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://blog.naver.com/ittalentdonation/221194850771&lt;/a&gt;&lt;/p&gt;</description>
      <category>Embedded : : Architecture/: : Peripheral</category>
      <author>Jay.P Morgan</author>
      <guid isPermaLink="true">https://eartist.tistory.com/1281</guid>
      <comments>https://eartist.tistory.com/1281#entry1281comment</comments>
      <pubDate>Fri, 8 May 2026 11:21:24 +0900</pubDate>
    </item>
    <item>
      <title>ADI - DAI와 NXP - SAI</title>
      <link>https://eartist.tistory.com/1280</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;border-left: #0B2161 10px solid; padding-right: 10px; border-bottom: #0B2161 2px solid; pading-bottom: px; padding-top: 0px; margin: 10px 0px 5px; line-height: 30px;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;b&gt; ◈ &amp;nbsp;ADI - DAI와 NXP - SAI&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Analog Devices(ADI)의 &lt;b data-index-in-node=&quot;21&quot; data-path-to-node=&quot;0&quot;&gt;DAI&lt;/b&gt;와 NXP i.MX8M Plus의 &lt;b data-index-in-node=&quot;43&quot; data-path-to-node=&quot;0&quot;&gt;SAI&lt;/b&gt;는 모두 디지털 오디오 데이터를 주고받기 위한 핵심 인터페이스이지만, 설계 철학과 유연성 면에서 뚜렷한 차이가 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; 1.1&lt;span style=&quot;color: #1f1f1f; text-align: start;&quot;&gt;&amp;nbsp; Analog Devices의 DAI (Digital Audio Interface)&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #1f1f1f; text-align: start;&quot; data-path-to-node=&quot;2&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #1f1f1f; text-align: start;&quot; data-path-to-node=&quot;3&quot; data-ke-size=&quot;size16&quot;&gt;ADI의 SHARC나 SigmaDSP 프로세서에서 주로 볼 수 있는 &lt;b data-index-in-node=&quot;38&quot; data-path-to-node=&quot;3&quot;&gt;DAI&lt;/b&gt;는 단순한 포트를 넘어선 '신호 라우팅 매트릭스'에 가깝습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,0,0&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;구조적 특징:&lt;/b&gt; DAI는 내부적으로 SRU(Signal Routing Unit)와 연결되어 있습니다. 이는 물리적인 핀과 내부의 직렬 포트(SPORT), 정밀 클록 생성기(PCG), SRC(Sample Rate Converter) 등을 소프트웨어 설정만으로 자유롭게 연결할 수 있게 해줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,1,0&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;유연성:&lt;/b&gt; 특정 핀을 입력으로 쓸지, 출력으로 쓸지, 혹은 클록 신호만 내보낼지를 매우 자유롭게 구성할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,2,0&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;주요 기능:&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,2,1,0,0&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;-&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;SPORT (Serial Port):&lt;/b&gt; 실제 데이터를 처리하는 유닛으로, I2S, TDM, Left-Justified 등 다양한 규격을 지원합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,2,1,1,0&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;-&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;PCG (Precision Clock Generator):&lt;/b&gt; 외부 수정진동자 없이도 정밀한 오디오 마스터 클록을 생성하여 배분할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;4,3,0&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;장점:&lt;/b&gt; 복잡한 오디오 시스템(예: 수십 채널의 입출력이 필요한 카 오디오)에서 하드웨어 변경 없이 내부 라우팅만으로 신호 흐름을 바꿀 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; 1.&lt;span style=&quot;color: #1f1f1f; text-align: start;&quot;&gt;2 &amp;nbsp;NXP i.MX8M Plus의 SAI (Synchronous Audio Interface)&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #1f1f1f; text-align: start;&quot; data-path-to-node=&quot;5&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #1f1f1f; text-align: start;&quot; data-path-to-node=&quot;6&quot; data-ke-size=&quot;size16&quot;&gt;i.MX8M Plus에 탑재된 &lt;b data-index-in-node=&quot;17&quot; data-path-to-node=&quot;6&quot;&gt;SAI&lt;/b&gt;는 범용 애플리케이션 프로세서(AP)에서 표준적으로 사용하는 '고성능 동기식 직렬 인터페이스'입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,0,0&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;구조적 특징:&lt;/b&gt; 송신(TX)과 수신(RX) 섹션이 독립적인 비트 클록(BCLK)과 프레임 동기 신호(SYNC)를 가질 수 있도록 설계되었습니다. i.MX8MP에는 보통 여러 개의 SAI 인스턴스(SAI1~SAI7)가 있어 다채널 확장이 용이합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,1,0&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;시스템 통합:&lt;/b&gt; SoC 내부의 SDMA(Smart DMA)와 긴밀하게 연결되어 있어, CPU 점유율을 최소화하면서 대용량 오디오 데이터를 메모리로 실어 나르는 데 최적화되어 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,2,0&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;주요 기능:&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,2,1,0,0&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;-&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;다양한 프로토콜:&lt;/b&gt; I2S, AC97, TDM, DSP 모드를 지원합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,2,1,1,0&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;-&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;FIFO 지원:&lt;/b&gt; 각 SAI 모듈은 내부 FIFO를 가지고 있어 오디오 데이터의 언더런(Under-run)이나 오버런(Over-run)을 방지합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7,3,0&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;장점:&lt;/b&gt; 리눅스(ALSA/ASoC 프레임워크) 환경에서 드라이버 지원이 매우 탄탄하며, 멀티미디어 OS 위에서 안정적인 스트리밍을 구현하기에 적합합니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; 1.&lt;span style=&quot;color: #1f1f1f; text-align: start;&quot;&gt;3 &amp;nbsp;주요 차이점 요약&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #1f1f1f; text-align: start;&quot; data-path-to-node=&quot;9&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;color: #1f1f1f; text-align: start;&quot;&gt;
&lt;div style=&quot;color: #000000;&quot; data-ved=&quot;0CAAQ3ecQahcKEwjI75j1xaSUAxUAAAAAHQAAAAAQRg&quot; data-hveid=&quot;0&quot;&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-path-to-node=&quot;10&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style13&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;구분&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;ADI DAI&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;i.MX8M Plus SAI&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span data-path-to-node=&quot;10,1,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;10,1,0,0&quot;&gt;핵심 성격&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span data-path-to-node=&quot;10,1,1,0&quot;&gt;프로그래머블 라우팅 매트릭스&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span data-path-to-node=&quot;10,1,2,0&quot;&gt;독립적 송수신 직렬 인터페이스&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span data-path-to-node=&quot;10,2,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;10,2,0,0&quot;&gt;제어 방식&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span data-path-to-node=&quot;10,2,1,0&quot;&gt;SRU를 통한 핀-유닛 간 자유 매핑&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span data-path-to-node=&quot;10,2,2,0&quot;&gt;고정된 핀 기능 기반의 설정&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span data-path-to-node=&quot;10,3,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;10,3,0,0&quot;&gt;클록 관리&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span data-path-to-node=&quot;10,3,1,0&quot;&gt;내장 PCG를 통한 매우 정밀한 제어&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span data-path-to-node=&quot;10,3,2,0&quot;&gt;SoC 클록 트리에 의존 (PLL 설정 중심)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span data-path-to-node=&quot;10,4,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;10,4,0,0&quot;&gt;주요 용도&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span data-path-to-node=&quot;10,4,1,0&quot;&gt;실시간 오디오 신호 처리 (ANC, DSP 등)&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span data-path-to-node=&quot;10,4,2,0&quot;&gt;오디오 스트리밍 및 인포테인먼트 (IVI)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;color: #1f1f1f; text-align: start;&quot; data-path-to-node=&quot;11&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11&quot;&gt;요약하자면:&lt;/b&gt; ADI의 &lt;b data-index-in-node=&quot;12&quot; data-path-to-node=&quot;11&quot;&gt;DAI&lt;/b&gt;는 &quot;어떤 신호든 어디로든 보낼 수 있는 유연한 오디오 스위치보드&quot; 같은 느낌이라면, i.MX8MP의 &lt;b data-index-in-node=&quot;72&quot; data-path-to-node=&quot;11&quot;&gt;SAI&lt;/b&gt;는 &quot;정해진 통로를 통해 고속으로 오디오 데이터를 실어 나르는 효율적인 고속도로&quot;라고 이해하시면 쉽습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;border-left: #0B2161 10px solid; padding-right: 10px; border-bottom: #0B2161 2px solid; pading-bottom: px; padding-top: 0px; margin: 10px 0px 5px; line-height: 30px;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;b&gt;2. &amp;nbsp;ADI DSP와 NXP HeadUnit의 Pin 매칭&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; DSP(SHARC)와 i.MX8M Plus(SAI) 간에 디지털 오디오를 전송하려면, 두 보드 간의&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b data-index-in-node=&quot;63&quot; data-path-to-node=&quot;0&quot;&gt;I2S 또는 TDM 인터페이스 핀&lt;/b&gt;을 서로 일치시켜 연결해야 합니다.&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-path-to-node=&quot;1&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 보통 한쪽을&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b data-index-in-node=&quot;7&quot; data-path-to-node=&quot;1&quot;&gt;Master(클록 생성)&lt;/b&gt;, 다른 한쪽을 Slave(클록 수신)로 설정하여 동기화하는 것이 기본입니다.&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-path-to-node=&quot;1&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; 2.1 &amp;nbsp;하드웨어 핀 매핑 (I2S 기준)&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-path-to-node=&quot;1&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-path-to-node=&quot;4&quot; data-ke-size=&quot;size16&quot;&gt;두 보드 모두 확장 커넥터를 통해 관련 핀을 제공합니다. 아래 표는 일반적인 I2S 연결을 위한 핀 구성입니다.&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-path-to-node=&quot;4&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;color: #000000; text-align: start;&quot;&gt;
&lt;div data-ved=&quot;0CAAQ3ecQahcKEwiu0tGBxaiUAxUAAAAAHQAAAAAQFw&quot; data-hveid=&quot;0&quot;&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-path-to-node=&quot;5&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style13&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;신호 명칭&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;ADSP-21569 (DAI Pin)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;i.MX8MP (SAI Pin)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;설명&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;5,1,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,1,0,0&quot;&gt;BCLK&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;(Bit Clock)&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;5,1,1,0&quot;&gt;DAI0_PINxx (예: PIN01)&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;5,1,2,0&quot;&gt;SAIx_TXC / SAIx_RXC&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;5,1,3,0&quot;&gt;데이터 비트 단위 클록&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;5,2,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,2,0,0&quot;&gt;LRCLK&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;(Frame Sync)&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;5,2,1,0&quot;&gt;DAI0_PINxx (예: PIN02)&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;5,2,2,0&quot;&gt;SAIx_TXFS / SAIx_RXFS&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;5,2,3,0&quot;&gt;채널 구분 신호 (Left/Right)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;5,3,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,3,0,0&quot;&gt;SDATA_OUT&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;5,3,1,0&quot;&gt;DAI0_PINxx (예: PIN03)&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;5,3,2,0&quot;&gt;SAIx_RXD0 (i.MX8M 입력)&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;5,3,3,0&quot;&gt;DSP &amp;rarr; AP 데이터 전송&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;5,4,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,4,0,0&quot;&gt;SDATA_IN&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;5,4,1,0&quot;&gt;DAI0_PINxx (예: PIN04)&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;5,4,2,0&quot;&gt;SAIx_TXD0 (i.MX8M 출력)&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;5,4,3,0&quot;&gt;AP &amp;rarr; DSP 데이터 전송&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;5,5,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,5,0,0&quot;&gt;GND&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;5,5,1,0&quot;&gt;Digital Ground&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;5,5,2,0&quot;&gt;Digital Ground&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;5,5,3,0&quot;&gt;공통 접지 (필수)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;blockquote style=&quot;color: #000000; text-align: start;&quot; data-path-to-node=&quot;6&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-path-to-node=&quot;6,0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6,0&quot;&gt;&lt;span style=&quot;color: #ef6f53;&quot;&gt;주의&lt;/span&gt;:&lt;/b&gt;&amp;nbsp;ADI 보드의 경우 DAI 핀은 소프트웨어(SRU)로 설정하기 나름이므로, 사용 중인 예제 코드(LARK, CCES Framework 등)에서 어떤 DAI 핀을 SPORT로 할당했는지 먼저 확인해야 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; 2.2 &amp;nbsp;구체적인 보드별 Con 위치&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-path-to-node=&quot;9&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9&quot;&gt;ADSP-21569 EV-21569-EZKIT&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-path-to-node=&quot;10&quot; data-ke-size=&quot;size16&quot;&gt;이 보드는 주로&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b data-index-in-node=&quot;9&quot; data-path-to-node=&quot;10&quot;&gt;Expansion Interface 3 (EI3)&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;또는 별도의 하위 커넥터를 통해 DAI 핀을 인출합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;주로 DAI0 (PIN 1~20)이 오디오 입출력에 사용됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;매뉴얼의 'Connector Pinout' 섹션에서 사용하려는 SPORT(예: SPORT0)가 어느 PIN 번호에 매핑되어 있는지 확인하십시오.&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-path-to-node=&quot;12&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;12&quot;&gt;i.MX8M Plus EVK (PEVK)&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-path-to-node=&quot;13&quot; data-ke-size=&quot;size16&quot;&gt;주로 보드 우측의 40-pin Expansion Header (J14)를 사용합니다. Raspberry Pi 핀 배열과 유사하지만 SAI 기능이 할당되어 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;14,0,0&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;SAI3&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;또는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b data-index-in-node=&quot;8&quot; data-path-to-node=&quot;14,0,0&quot;&gt;SAI5&lt;/b&gt;가 주로 이 헤더에 할당됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;예: SAI3_TXD(PIN 38), SAI3_TXFS(PIN 35), SAI3_TXC(PIN 12) 등을 사용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; 2.3 &amp;nbsp;연결 시 핵심 체크리스트&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;17,0,0&quot;&gt;&amp;nbsp; (1) 전압 레벨 (V_IO):&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;두 보드 모두&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b data-index-in-node=&quot;8&quot; data-path-to-node=&quot;17,0,1,0,0&quot;&gt;3.3V LVCMOS&lt;/b&gt;를 사용하는지 반드시 확인하십시오. 만약 한쪽이 1.8V라면 레벨 시프터(Level Shifter)가 반드시 필요합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;17,1,0&quot;&gt;&amp;nbsp; (2) Master / Slave 설정:&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;일반적으로 시스템 안정성을 위해&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b data-index-in-node=&quot;18&quot; data-path-to-node=&quot;17,1,1,0,0&quot;&gt;ADSP-21569를 Master&lt;/b&gt;로 설정하고 정밀한 오디오 클록(BCLK, LRCLK)을 내보내면,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b data-index-in-node=&quot;74&quot; data-path-to-node=&quot;17,1,1,0,0&quot;&gt;i.MX8MP를 Slave&lt;/b&gt;로 설정하여 해당 클록에 맞춰 데이터를 받도록 구성하는 것이 좋습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;17,2,0&quot;&gt;&amp;nbsp; (3) MCLK (Master Clock) 전송 여부:&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;두 장치 간에 샘플링 레이트 동기화가 엄격해야 한다면, DSP의 MCLK를 i.MX8MP의&lt;span&gt;&amp;nbsp;&lt;/span&gt;SAI_MCLK&lt;span&gt;&amp;nbsp;&lt;/span&gt;핀으로 보내줘야 할 수도 있습니다. 하지만 단순 I2S 통신에서는 BCLK/LRCLK만으로도 충분한 경우가 많습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;17,3,0&quot;&gt;&amp;nbsp; (4) TDM 모드 사용 시:&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;8채널 이상을 전송한다면 TDM 모드를 써야 합니다. 이때는&lt;span&gt;&amp;nbsp;&lt;/span&gt;Frame Sync&lt;span&gt;&amp;nbsp;&lt;/span&gt;신호의 폭(Pulse vs 50% Duty) 설정을 두 보드에서 일치시켜야 소리가 깨지지 않습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Embedded : : Architecture/: : Peripheral</category>
      <author>Jay.P Morgan</author>
      <guid isPermaLink="true">https://eartist.tistory.com/1280</guid>
      <comments>https://eartist.tistory.com/1280#entry1280comment</comments>
      <pubDate>Thu, 7 May 2026 22:13:24 +0900</pubDate>
    </item>
    <item>
      <title>ONNX Tutorial</title>
      <link>https://eartist.tistory.com/1277</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;border-left: #0B2161 10px solid; padding-right: 10px; border-bottom: #0B2161 2px solid; pading-bottom: px; padding-top: 0px; margin: 10px 0px 5px; line-height: 30px;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;b&gt;1. &amp;nbsp;&lt;span style=&quot;color: #27262b; text-align: start;&quot;&gt;ONNX Runtime Inferencing: API Basics&lt;/span&gt;&lt;span style=&quot;color: #27262b; text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이 튜토리얼에서는 각 언어 API를 사용하여 ONNX 런타임으로 기본적인 추론을 수행하는 방법을 보여줍니다. 더 많은 예제는 &lt;a style=&quot;color: #226aca;&quot; href=&quot;https://github.com/microsoft/onnxruntime-inference-examples&quot;&gt;microsoft/onnxruntime-inference-examples&lt;/a&gt;에서 확인할 수 있습니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; 1.1&amp;nbsp; Python&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;onnx-runtime-inferencing-api-basics&quot; style=&quot;color: #27262b; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #27262b; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Scikit-learn Logistic Regression&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #27262b; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #27262b; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;ONNX&amp;nbsp;런타임은&amp;nbsp;학습&amp;nbsp;프레임워크에&amp;nbsp;의존하지&amp;nbsp;않고&amp;nbsp;CPU&amp;nbsp;또는&amp;nbsp;GPU에서&amp;nbsp;고성능으로&amp;nbsp;머신&amp;nbsp;러닝&amp;nbsp;모델을&amp;nbsp;쉽게&amp;nbsp;실행할&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;방법을&amp;nbsp;제공합니다.&amp;nbsp;머신&amp;nbsp;러닝&amp;nbsp;프레임워크는&amp;nbsp;일반적으로&amp;nbsp;예측보다는&amp;nbsp;배치&amp;nbsp;학습에&amp;nbsp;최적화되어&amp;nbsp;있지만,&amp;nbsp;애플리케이션,&amp;nbsp;웹사이트&amp;nbsp;및&amp;nbsp;서비스에서는&amp;nbsp;예측이&amp;nbsp;더&amp;nbsp;일반적인&amp;nbsp;시나리오입니다.&amp;nbsp;ONNX&amp;nbsp;런타임을&amp;nbsp;사용하면&amp;nbsp;다음과&amp;nbsp;같은&amp;nbsp;작업을&amp;nbsp;수행할&amp;nbsp;수&amp;nbsp;있습니다.&lt;/p&gt;
&lt;p style=&quot;color: #27262b; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #27262b; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; (1) 원하는 프레임워크를 사용하여 모델을 학습합니다.&lt;/p&gt;
&lt;p style=&quot;color: #27262b; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; (2) 모델을 ONNX 형식으로 변환하거나 내보냅니다. 자세한 내용은 ONNX 튜토리얼을 참조하세요.&lt;/p&gt;
&lt;p style=&quot;color: #27262b; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; (3) ONNX 런타임을 사용하여 모델을 로드하고 실행합니다.&lt;/p&gt;
&lt;p style=&quot;color: #27262b; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #27262b; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이&amp;nbsp;튜토리얼에서는&amp;nbsp;scikit-learn을&amp;nbsp;사용하여&amp;nbsp;파이프라인을&amp;nbsp;간략하게&amp;nbsp;구성하고,&amp;nbsp;이를&amp;nbsp;ONNX&amp;nbsp;형식으로&amp;nbsp;변환한&amp;nbsp;다음&amp;nbsp;첫&amp;nbsp;번째&amp;nbsp;예측을&amp;nbsp;실행합니다.&lt;/p&gt;
&lt;p style=&quot;color: #27262b; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #27262b; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1단계:&amp;nbsp;선호하는&amp;nbsp;프레임워크를&amp;nbsp;사용하여&amp;nbsp;모델을&amp;nbsp;학습시키세요.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;저희는&amp;nbsp;유명한&amp;nbsp;iris&amp;nbsp;데이터셋을&amp;nbsp;사용하겠습니다.&lt;/p&gt;
&lt;p style=&quot;color: #27262b; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;lt;&amp;lt;&amp;lt;&lt;/p&gt;
&lt;div style=&quot;background-color: #263238; color: #eeffff; text-align: start;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&amp;nbsp; from &lt;/span&gt;&lt;span style=&quot;color: #f07178;&quot;&gt;sklearn&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #f07178;&quot;&gt;datasets&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; import load_iris&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&amp;nbsp; from &lt;/span&gt;&lt;span style=&quot;color: #f07178;&quot;&gt;sklearn&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #f07178;&quot;&gt;model_selection&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; import train_test_split&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&amp;nbsp; iris &lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;load_iris&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;()&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&amp;nbsp; X&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; y &lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f07178;&quot;&gt;iris&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #f07178;&quot;&gt;data&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f07178;&quot;&gt;iris&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #f07178;&quot;&gt;target&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&amp;nbsp; X_train&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; X_test&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; y_train&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; y_test &lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;train_test_split&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;X&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; y&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&amp;nbsp; from &lt;/span&gt;&lt;span style=&quot;color: #f07178;&quot;&gt;sklearn&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #f07178;&quot;&gt;linear_model&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; import LogisticRegression&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&amp;nbsp; clr &lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;LogisticRegression&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;()&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #f07178;&quot;&gt;&amp;nbsp; clr&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;fit&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;X_train&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; y_train&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;&amp;nbsp; print&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;clr&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;color: #27262b; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #263238; color: #eeffff; text-align: start;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; LogisticRegression&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;()&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;color: #27262b; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #27262b; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #27262b; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2단계:&amp;nbsp;모델을&amp;nbsp;ONNX&amp;nbsp;형식으로&amp;nbsp;변환&amp;nbsp;또는&amp;nbsp;내보내기&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;ONNX는&amp;nbsp;머신러닝&amp;nbsp;모델을&amp;nbsp;설명하는&amp;nbsp;형식입니다.&amp;nbsp;모델을&amp;nbsp;구성하는&amp;nbsp;데&amp;nbsp;일반적으로&amp;nbsp;사용되는&amp;nbsp;연산자&amp;nbsp;집합을&amp;nbsp;정의합니다.&amp;nbsp;다른&amp;nbsp;모델&amp;nbsp;형식을&amp;nbsp;ONNX&amp;nbsp;형식으로&amp;nbsp;변환하는&amp;nbsp;도구가&amp;nbsp;있습니다.&amp;nbsp;여기서는&amp;nbsp;ONNXMLTools를&amp;nbsp;사용하겠습니다.&lt;br /&gt;&lt;br /&gt;&amp;lt;&amp;lt;&amp;lt;&lt;/p&gt;
&lt;div style=&quot;background-color: #263238; color: #eeffff; text-align: start;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&amp;nbsp; from skl2onnx import convert_sklearn&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&amp;nbsp; from &lt;/span&gt;&lt;span style=&quot;color: #f07178;&quot;&gt;skl2onnx&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #f07178;&quot;&gt;common&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #f07178;&quot;&gt;data_types&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; import FloatTensorType&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&amp;nbsp; initial_type &lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;[(&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;'&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;float_input&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;'&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;FloatTensorType&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;([&lt;/span&gt;&lt;span style=&quot;color: #ff5370;&quot;&gt;None&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;4&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;))&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;]&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&amp;nbsp; onx = convert_sklearn&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;clr&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;initial_types&lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;initial_type&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&amp;nbsp; with open&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;logreg_iris&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;onnx&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;wb&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;) as f:&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;&amp;nbsp; f.write(onx.SerializeToString())&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3단계:&amp;nbsp;ONNX&amp;nbsp;런타임을&amp;nbsp;사용하여&amp;nbsp;모델&amp;nbsp;로드&amp;nbsp;및&amp;nbsp;실행&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;이&amp;nbsp;머신러닝&amp;nbsp;모델의&amp;nbsp;예측값을&amp;nbsp;계산하기&amp;nbsp;위해&amp;nbsp;ONNX&amp;nbsp;런타임을&amp;nbsp;사용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;&amp;lt;&amp;lt;&lt;/p&gt;
&lt;div style=&quot;background-color: #263238; color: #eeffff; text-align: start;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&amp;nbsp; import numpy&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&amp;nbsp; import onnxruntime as rt&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&amp;nbsp; sess &lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f07178;&quot;&gt;rt&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;InferenceSession&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;(&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;&amp;nbsp; &quot;&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;logreg_iris.onnx&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; providers&lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #f07178;&quot;&gt;rt&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;get_available_providers&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;())&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&amp;nbsp; input_name &lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f07178;&quot;&gt;sess&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;get_inputs&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;()[&lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;].&lt;/span&gt;&lt;span style=&quot;color: #f07178;&quot;&gt;name&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&amp;nbsp; pred_onx &lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f07178;&quot;&gt;sess&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;run&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;None&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; {input_name: &lt;/span&gt;&lt;span style=&quot;color: #f07178;&quot;&gt;X_test&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;astype&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #f07178;&quot;&gt;numpy&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #f07178;&quot;&gt;float32&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;)[&lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;]&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;&amp;nbsp; print&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;pred_onx&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #263238; color: #eeffff; text-align: start;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;&amp;nbsp; [&lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;1&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;&amp;nbsp; &amp;nbsp;0&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;]&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드에서&amp;nbsp;특정&amp;nbsp;출력값을&amp;nbsp;얻으려면,&amp;nbsp;출력값의&amp;nbsp;이름을&amp;nbsp;목록에&amp;nbsp;지정하여&amp;nbsp;코드를&amp;nbsp;수정할&amp;nbsp;수&amp;nbsp;있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;&amp;lt;&amp;lt;&lt;/p&gt;
&lt;div style=&quot;background-color: #263238; color: #eeffff; text-align: start;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&amp;nbsp; import numpy&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&amp;nbsp; import onnxruntime as rt&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&amp;nbsp; sess &lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f07178;&quot;&gt;rt&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;InferenceSession&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;(&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;logreg_iris.onnx&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; providers&lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #f07178;&quot;&gt;rt&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;get_available_providers&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;())&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&amp;nbsp; input_name &lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f07178;&quot;&gt;sess&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;get_inputs&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;()[&lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;].&lt;/span&gt;&lt;span style=&quot;color: #f07178;&quot;&gt;name&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&amp;nbsp; label_name &lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f07178;&quot;&gt;sess&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;get_outputs&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;()[&lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;].&lt;/span&gt;&lt;span style=&quot;color: #f07178;&quot;&gt;name&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&amp;nbsp; pred_onx &lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f07178;&quot;&gt;sess&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;run&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;(&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; [&lt;/span&gt;&lt;span style=&quot;color: #ff5370;&quot;&gt;label_name&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;input_name: &lt;/span&gt;&lt;span style=&quot;color: #f07178;&quot;&gt;X_test&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;astype&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #f07178;&quot;&gt;numpy&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #f07178;&quot;&gt;float32&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;)})[&lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;]&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;&amp;nbsp; print&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;pred_onx&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #263238; color: #eeffff; text-align: start;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;&amp;nbsp; [&lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;1&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;&amp;nbsp; &amp;nbsp;0&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;]&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;color: #27262b; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #27262b; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; 1.2 &amp;nbsp;Image recognition (Resnet50)&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #27262b; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #5c5962; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a style=&quot;color: #226aca;&quot; href=&quot;https://github.com/onnx/onnx-docker/blob/master/onnx-ecosystem/inference_demos/resnet50_modelzoo_onnxruntime_inference.ipynb&quot;&gt;Image recognition (Resnet50)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #27262b; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; 1.3 &amp;nbsp;C/C++ examples&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #5c5962; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a style=&quot;color: #226aca;&quot; href=&quot;https://github.com/microsoft/onnxruntime-inference-examples/tree/main/c_cxx&quot;&gt;C/C++ examples&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; 1.4 &amp;nbsp;C#&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #5c5962; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a style=&quot;color: #226aca;&quot; href=&quot;https://onnxruntime.ai/docs/tutorials/csharp/fasterrcnn_csharp.html&quot;&gt;Object detection (Faster RCNN)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a style=&quot;color: #226aca;&quot; href=&quot;https://onnxruntime.ai/docs/tutorials/csharp/resnet50_csharp.html&quot;&gt;Image recognition (ResNet50 v2)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; 1.5 &amp;nbsp;Java&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #5c5962; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a style=&quot;color: #226aca;&quot; href=&quot;https://onnxruntime.ai/docs/tutorials/mnist_java.html&quot;&gt;Number recognition (MNIST)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; 1.6 &amp;nbsp;JavaScript&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #5c5962; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a style=&quot;color: #226aca;&quot; href=&quot;https://github.com/microsoft/onnxruntime-inference-examples/tree/main/js&quot;&gt;ONNX Runtime JavaScript examples&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;border-left: #0B2161 10px solid; padding-right: 10px; border-bottom: #0B2161 2px solid; pading-bottom: px; padding-top: 0px; margin: 10px 0px 5px; line-height: 30px;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;b&gt;2. Accelation PyTorch&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; 2.1 &amp;nbsp;PyTorch Inference&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;PyTorch&amp;nbsp;모델&amp;nbsp;추론&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PyTorch에&amp;nbsp;대해&amp;nbsp;알아보고&amp;nbsp;PyTorch&amp;nbsp;모델을&amp;nbsp;사용한&amp;nbsp;추론&amp;nbsp;방법을&amp;nbsp;살펴보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PyTorch는&amp;nbsp;사용하기&amp;nbsp;쉽고&amp;nbsp;유연한&amp;nbsp;API,&amp;nbsp;특히&amp;nbsp;자연어&amp;nbsp;처리(NLP)&amp;nbsp;영역에서&amp;nbsp;제공되는&amp;nbsp;풍부한&amp;nbsp;기성&amp;nbsp;모델,&amp;nbsp;그리고&amp;nbsp;도메인별&amp;nbsp;라이브러리를&amp;nbsp;통해&amp;nbsp;딥러닝&amp;nbsp;분야를&amp;nbsp;선도하고&amp;nbsp;있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PyTorch로&amp;nbsp;구축된&amp;nbsp;모델을&amp;nbsp;사용하려는&amp;nbsp;개발자와&amp;nbsp;애플리케이션&amp;nbsp;생태계가&amp;nbsp;점점&amp;nbsp;확대되고&amp;nbsp;있으며,&amp;nbsp;이&amp;nbsp;글에서는&amp;nbsp;PyTorch&amp;nbsp;모델&amp;nbsp;추론에&amp;nbsp;대한&amp;nbsp;간략한&amp;nbsp;개요를&amp;nbsp;제공합니다.&amp;nbsp;PyTorch&amp;nbsp;모델을&amp;nbsp;추론하는&amp;nbsp;방법은&amp;nbsp;여러&amp;nbsp;가지가&amp;nbsp;있으며,&amp;nbsp;아래에&amp;nbsp;나열되어&amp;nbsp;있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 글은 PyTorch 모델을 학습시키는 방법이 아닌, PyTorch 모델을 사용한 추론 방법에 대한 정보를 찾는 독자를 대상으로 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;목차&lt;/b&gt;&lt;/p&gt;
&lt;ul id=&quot;markdown-toc&quot; style=&quot;list-style-type: disc; color: #5c5962; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a id=&quot;markdown-toc-overview-of-pytorch&quot; style=&quot;color: #226aca;&quot; href=&quot;https://onnxruntime.ai/docs/tutorials/accelerate-pytorch/pytorch.html#overview-of-pytorch&quot;&gt;Overview of PyTorch&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a id=&quot;markdown-toc-inference-options&quot; style=&quot;color: #226aca;&quot; href=&quot;https://onnxruntime.ai/docs/tutorials/accelerate-pytorch/pytorch.html#inference-options&quot;&gt;Inference options&lt;/a&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a id=&quot;markdown-toc-inference-with-native-pytorch&quot; style=&quot;color: #226aca;&quot; href=&quot;https://onnxruntime.ai/docs/tutorials/accelerate-pytorch/pytorch.html#inference-with-native-pytorch&quot;&gt;Inference with native PyTorch&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a id=&quot;markdown-toc-inference-with-torchscript&quot; style=&quot;color: #226aca;&quot; href=&quot;https://onnxruntime.ai/docs/tutorials/accelerate-pytorch/pytorch.html#inference-with-torchscript&quot;&gt;Inference with TorchScript&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a id=&quot;markdown-toc-inference-with-onnxruntime&quot; style=&quot;color: #226aca;&quot; href=&quot;https://onnxruntime.ai/docs/tutorials/accelerate-pytorch/pytorch.html#inference-with-onnxruntime&quot;&gt;Inference with ONNXRuntime&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a id=&quot;markdown-toc-examples&quot; style=&quot;color: #226aca;&quot; href=&quot;https://onnxruntime.ai/docs/tutorials/accelerate-pytorch/pytorch.html#examples&quot;&gt;Examples&lt;/a&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a id=&quot;markdown-toc-export-model-to-onnx&quot; style=&quot;color: #226aca;&quot; href=&quot;https://onnxruntime.ai/docs/tutorials/accelerate-pytorch/pytorch.html#export-model-to-onnx&quot;&gt;Export model to ONNX&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a id=&quot;markdown-toc-accelerated-inference-with-onnxruntime&quot; style=&quot;color: #226aca;&quot; href=&quot;https://onnxruntime.ai/docs/tutorials/accelerate-pytorch/pytorch.html#accelerated-inference-with-onnxruntime&quot;&gt;Accelerated inference with ONNXRuntime&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a id=&quot;markdown-toc-resnet-50&quot; style=&quot;color: #226aca;&quot; href=&quot;https://onnxruntime.ai/docs/tutorials/accelerate-pytorch/pytorch.html#resnet-50&quot;&gt;RESNET-50&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;PyTorch&amp;nbsp;개요&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PyTorch의&amp;nbsp;핵심은&amp;nbsp;nn.Module&amp;nbsp;클래스입니다.&amp;nbsp;이&amp;nbsp;클래스는&amp;nbsp;전체&amp;nbsp;딥러닝&amp;nbsp;모델&amp;nbsp;또는&amp;nbsp;단일&amp;nbsp;레이어를&amp;nbsp;나타냅니다.&amp;nbsp;모듈은&amp;nbsp;조합하거나&amp;nbsp;확장하여&amp;nbsp;모델을&amp;nbsp;구축할&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;자체&amp;nbsp;모듈을&amp;nbsp;작성하려면&amp;nbsp;모델&amp;nbsp;입력과&amp;nbsp;학습된&amp;nbsp;가중치를&amp;nbsp;기반으로&amp;nbsp;출력을&amp;nbsp;계산하는&amp;nbsp;순방향&amp;nbsp;함수를&amp;nbsp;구현해야&amp;nbsp;합니다.&amp;nbsp;자체&amp;nbsp;PyTorch&amp;nbsp;모델을&amp;nbsp;작성하는&amp;nbsp;경우,&amp;nbsp;모델을&amp;nbsp;학습시키는&amp;nbsp;과정도&amp;nbsp;함께&amp;nbsp;진행해야&amp;nbsp;합니다.&amp;nbsp;또는&amp;nbsp;PyTorch&amp;nbsp;자체&amp;nbsp;또는&amp;nbsp;HuggingFace와&amp;nbsp;같은&amp;nbsp;다른&amp;nbsp;라이브러리에서&amp;nbsp;제공하는&amp;nbsp;사전&amp;nbsp;학습된&amp;nbsp;모델을&amp;nbsp;사용할&amp;nbsp;수도&amp;nbsp;있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PyTorch를 사용하여 이미지 처리 모델을 코딩하는 방법은 다음과 같습니다.&lt;/p&gt;
&lt;div style=&quot;background-color: #263238; color: #eeffff; text-align: start;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&amp;nbsp; import torch&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&amp;nbsp; import &lt;/span&gt;&lt;span style=&quot;color: #f07178;&quot;&gt;torch&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #f07178;&quot;&gt;nn&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; as nn&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&amp;nbsp; import &lt;/span&gt;&lt;span style=&quot;color: #f07178;&quot;&gt;torchvision&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #f07178;&quot;&gt;transforms&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; as T&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&amp;nbsp; from &lt;/span&gt;&lt;span style=&quot;color: #f07178;&quot;&gt;torchvision&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #f07178;&quot;&gt;models&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; import resnet18&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; ResNet18_Weights&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;&amp;nbsp; class&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;Predictor&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;nn&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #ff5370;&quot;&gt;Module&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;:&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;def&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;__init__&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;self&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;:&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;super&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;().&lt;/span&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;__init__&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;()&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;weights &lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f07178;&quot;&gt;ResNet18_Weights&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #f07178;&quot;&gt;DEFAULT&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f07178;&quot;&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;self&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #f07178;&quot;&gt;resnet18&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;resnet18&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;weights&lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;weights&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; progress&lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;False&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;).&lt;/span&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;eval&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;()&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f07178;&quot;&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;self&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #f07178;&quot;&gt;transforms&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f07178;&quot;&gt;weights&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;transforms&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;()&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;def&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;forward&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;self&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;x&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;torch&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #ff5370;&quot;&gt;Tensor&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #f07178;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f07178;&quot;&gt;torch&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;.Tensor:&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;with &lt;/span&gt;&lt;span style=&quot;color: #f07178;&quot;&gt;torch&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;no_grad&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;:&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;x &lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f07178;&quot;&gt;self&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;transforms&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;x&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;y_pred &lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f07178;&quot;&gt;self&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;resnet18&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;x&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;return&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f07178;&quot;&gt;y_pred&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;argmax&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;dim&lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;color: #5c5962; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;HuggingFace&amp;nbsp;라이브러리를&amp;nbsp;사용하여&amp;nbsp;언어&amp;nbsp;모델을&amp;nbsp;생성하려면&amp;nbsp;다음&amp;nbsp;단계를&amp;nbsp;따르세요.&lt;/p&gt;
&lt;p style=&quot;color: #5c5962; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #263238; color: #eeffff; text-align: start;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&amp;nbsp; model_name &lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;bert-large-uncased-whole-word-masking-finetuned-squad&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;&quot;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&amp;nbsp; tokenizer &lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f07178;&quot;&gt;transformers&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #f07178;&quot;&gt;BertTokenizer&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;from_pretrained&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;model_name&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&amp;nbsp; model &lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f07178;&quot;&gt;transformers&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #f07178;&quot;&gt;BertForQuestionAnswering&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;from_pretrained&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;model_name&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;color: #5c5962; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #5c5962; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;학습된&amp;nbsp;모델을&amp;nbsp;생성하거나&amp;nbsp;가져온&amp;nbsp;후,&amp;nbsp;추론을&amp;nbsp;수행하기&amp;nbsp;위해&amp;nbsp;어떻게&amp;nbsp;실행할까요?&amp;nbsp;아래에서는&amp;nbsp;PyTorch에서&amp;nbsp;추론을&amp;nbsp;수행하는&amp;nbsp;데&amp;nbsp;사용할&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;몇&amp;nbsp;가지&amp;nbsp;접근&amp;nbsp;방식을&amp;nbsp;설명합니다.&lt;/p&gt;
&lt;p style=&quot;color: #5c5962; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #5c5962; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;추론&amp;nbsp;옵션&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #5c5962; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;PyTorch 네이티브를 사용한 추론&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #5c5962; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #5c5962; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;성능이나 크기에 민감하지 않고 Python 실행 파일과 라이브러리가 포함된 환경에서 실행하는 경우, 애플리케이션을 PyTorch 네이티브로 실행할 수 있습니다.&lt;/p&gt;
&lt;p style=&quot;color: #5c5962; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;학습된&amp;nbsp;모델이&amp;nbsp;준비되면,&amp;nbsp;데이터&amp;nbsp;과학&amp;nbsp;팀에서&amp;nbsp;추론을&amp;nbsp;위해&amp;nbsp;모델을&amp;nbsp;저장하고&amp;nbsp;불러오는&amp;nbsp;데&amp;nbsp;사용할&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;두&amp;nbsp;가지&amp;nbsp;방법이&amp;nbsp;있습니다.&lt;br /&gt;&amp;nbsp; (1) 전체 모델 저장 및 불러오기&lt;/p&gt;
&lt;div style=&quot;background-color: #263238; color: #eeffff; text-align: start;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&amp;nbsp; # Save the entire model to PATH&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #f07178;&quot;&gt;&amp;nbsp; torch&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;save&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;model&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; PATH&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&amp;nbsp; # Load the model from PATH &lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;and&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; set eval mode &lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;for&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; inference&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&amp;nbsp; model &lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f07178;&quot;&gt;torch&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;load&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;PATH&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #f07178;&quot;&gt;&amp;nbsp; model&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;eval&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;()&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;color: #5c5962; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #5c5962; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; (2) 모델의 매개변수를 저장하고, 모델을 다시 선언한 다음, 매개변수를 불러옵니다.&lt;/p&gt;
&lt;div style=&quot;background-color: #263238; color: #eeffff; text-align: start;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&amp;nbsp; # Save the model parameters&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #f07178;&quot;&gt;&amp;nbsp; torch&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;save&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #f07178;&quot;&gt;model&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;state_dict&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;(),&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; PATH&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&amp;nbsp; # Redeclare the model &lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;and&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; load the saved parameters&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&amp;nbsp; model &lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;TheModel&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;...&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #f07178;&quot;&gt;&amp;nbsp; model&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;load_state_dict&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #f07178;&quot;&gt;torch&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;load&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;PATH&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;))&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #f07178;&quot;&gt;&amp;nbsp; model&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;eval&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;()&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;color: #5c5962; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #5c5962; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 어떤 방법을 사용할지는 구성에 따라 다릅니다. 전체 모델을 저장하고 불러오는 방식은 모델을 다시 선언하거나 모델 코드 자체에 접근할 필요가 없다는 장점이 있습니다. 하지만 저장 환경과 불러오는 환경의 클래스, 메서드, 매개변수가 일치해야 한다는 단점이 있습니다(이러한 요소들은 직접 직렬화 및 역직렬화되기 때문입니다).&lt;/p&gt;
&lt;p style=&quot;color: #5c5962; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #5c5962; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 모델의 학습된 매개변수(상태 사전, state_dict)를 저장하는 방식은 원본 모델 코드에 접근할 수 있는 한 첫 번째 방식보다 유연합니다.&lt;/p&gt;
&lt;p style=&quot;color: #5c5962; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #5c5962; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 모델 추론에 네이티브 PyTorch를 사용하지 않으려는 주된 이유는 두 가지입니다. 첫째, Python 런타임과 PyTorch 라이브러리 및 관련 종속성이 포함된 환경에서 실행해야 합니다. 이러한 파일들의 용량은 수 기가바이트에 달합니다. 모바일, 웹 브라우저 또는 특수 하드웨어와 같은 환경에서 실행하려는 경우 네이티브 PyTorch를 사용한 PyTorch 추론은 제대로 작동하지 않습니다. 둘째, 성능 문제입니다. PyTorch 모델은 기본 설정 상태에서는 애플리케이션에 필요한 성능을 제공하지 못할 수 있습니다.&lt;/p&gt;
&lt;p style=&quot;color: #5c5962; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #5c5962; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #5c5962; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;TorchScript를 사용한 추론&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #5c5962; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;PyTorch&amp;nbsp;또는&amp;nbsp;다른&amp;nbsp;Python&amp;nbsp;라이브러리를&amp;nbsp;설치할&amp;nbsp;수&amp;nbsp;없는&amp;nbsp;제약이&amp;nbsp;있는&amp;nbsp;환경에서&amp;nbsp;실행하는&amp;nbsp;경우,&amp;nbsp;PyTorch&amp;nbsp;모델을&amp;nbsp;TorchScript로&amp;nbsp;변환하여&amp;nbsp;추론을&amp;nbsp;수행하는&amp;nbsp;옵션이&amp;nbsp;있습니다.&amp;nbsp;TorchScript는&amp;nbsp;Python의&amp;nbsp;하위&amp;nbsp;집합으로,&amp;nbsp;Python이&amp;nbsp;아닌&amp;nbsp;환경에서도&amp;nbsp;로드하고&amp;nbsp;실행할&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;직렬화된&amp;nbsp;모델을&amp;nbsp;생성할&amp;nbsp;수&amp;nbsp;있도록&amp;nbsp;합니다.&lt;/p&gt;
&lt;div style=&quot;background-color: #263238; color: #eeffff; text-align: start;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&amp;nbsp; # Export to TorchScript&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&amp;nbsp; script &lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f07178;&quot;&gt;torch&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #f07178;&quot;&gt;jit&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;script&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;model&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; example&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&amp;nbsp; # Save scripted model&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #f07178;&quot;&gt;&amp;nbsp; script&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;save&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;PATH&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;color: #5c5962; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #263238; color: #eeffff; text-align: start;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&amp;nbsp; # Load scripted model&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&amp;nbsp; model &lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f07178;&quot;&gt;torch&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #f07178;&quot;&gt;jit&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;load&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;PATH&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #f07178;&quot;&gt;&amp;nbsp; model&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;eval&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;()&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #263238; color: #eeffff; text-align: start;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;&amp;nbsp; #include&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;torch/script.h&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&amp;nbsp; &amp;nbsp; ...&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; torch&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;jit&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;script&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;Module &lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;module&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;try&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;{&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #546e7a;&quot;&gt; &lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span&gt; &lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;// Deserialize the ScriptModule&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;module&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;torch&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;jit&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;load&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;PATH&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;}&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;catch&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;c10&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;Error&lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; e&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;{&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;...&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;}&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&amp;nbsp; &amp;nbsp; ...&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;color: #5c5962; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #5c5962; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #5c5962; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;TorchScript&amp;nbsp;방식을&amp;nbsp;사용하면&amp;nbsp;PyTorch&amp;nbsp;모델에&amp;nbsp;대한&amp;nbsp;추론을&amp;nbsp;수행하기&amp;nbsp;위해&amp;nbsp;환경에&amp;nbsp;Python&amp;nbsp;런타임이&amp;nbsp;필요하지는&amp;nbsp;않지만,&amp;nbsp;libtorch&amp;nbsp;바이너리를&amp;nbsp;설치해야&amp;nbsp;합니다.&amp;nbsp;그런데&amp;nbsp;이&amp;nbsp;바이너리의&amp;nbsp;용량이&amp;nbsp;환경에&amp;nbsp;비해&amp;nbsp;너무&amp;nbsp;클&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;또한&amp;nbsp;애플리케이션에&amp;nbsp;필요한&amp;nbsp;성능을&amp;nbsp;얻지&amp;nbsp;못할&amp;nbsp;수도&amp;nbsp;있습니다.&lt;/p&gt;
&lt;p style=&quot;color: #5c5962; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #5c5962; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;ONNXRuntime을&amp;nbsp;사용한&amp;nbsp;추론&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #5c5962; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;성능과 이식성이 가장 중요한 경우, ONNXRuntime을 사용하여 PyTorch 모델을 추론할 수 있습니다. ONNXRuntime을 사용하면 지연 시간과 메모리 사용량을 줄이고 처리량을 높일 수 있습니다. 또한 ONNXRuntime에서 제공하는 언어 바인딩 및 라이브러리를 사용하여 클라우드, 엣지, 웹 또는 모바일 환경에서 모델을 실행할 수 있습니다.&lt;br /&gt;&lt;br /&gt;첫&amp;nbsp;번째&amp;nbsp;단계는&amp;nbsp;PyTorch&amp;nbsp;ONNX&amp;nbsp;익스포터를&amp;nbsp;사용하여&amp;nbsp;PyTorch&amp;nbsp;모델을&amp;nbsp;ONNX&amp;nbsp;형식으로&amp;nbsp;내보내는&amp;nbsp;것입니다.&lt;/p&gt;
&lt;div style=&quot;background-color: #263238; color: #eeffff; text-align: start;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&amp;nbsp; # Specify example data&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&amp;nbsp; example &lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; ... &lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&amp;nbsp; # Export model to ONNX format&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&amp;nbsp; torch&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;onnx&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;model&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; PATH&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; example&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;color: #5c5962; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #5c5962; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;ONNX&amp;nbsp;형식으로&amp;nbsp;내보낸&amp;nbsp;후에는&amp;nbsp;선택적으로&amp;nbsp;Netron&amp;nbsp;뷰어에서&amp;nbsp;모델을&amp;nbsp;확인하여&amp;nbsp;모델&amp;nbsp;그래프,&amp;nbsp;입력&amp;nbsp;및&amp;nbsp;출력&amp;nbsp;노드의&amp;nbsp;이름과&amp;nbsp;모양,&amp;nbsp;그리고&amp;nbsp;가변&amp;nbsp;크기의&amp;nbsp;입력&amp;nbsp;및&amp;nbsp;출력을&amp;nbsp;가진&amp;nbsp;노드(동적&amp;nbsp;축)를&amp;nbsp;이해할&amp;nbsp;수&amp;nbsp;있습니다.&lt;/p&gt;
&lt;p style=&quot;color: #5c5962; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #5c5962; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;그런&amp;nbsp;다음&amp;nbsp;원하는&amp;nbsp;환경에서&amp;nbsp;ONNX&amp;nbsp;모델을&amp;nbsp;실행할&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;ONNXRuntime&amp;nbsp;엔진은&amp;nbsp;C++로&amp;nbsp;구현되었으며&amp;nbsp;C++,&amp;nbsp;Python,&amp;nbsp;C#,&amp;nbsp;Java,&amp;nbsp;Javascript,&amp;nbsp;Julia&amp;nbsp;및&amp;nbsp;Ruby&amp;nbsp;API를&amp;nbsp;제공합니다.&amp;nbsp;ONNXRuntime은&amp;nbsp;Linux,&amp;nbsp;Mac,&amp;nbsp;Windows,&amp;nbsp;iOS&amp;nbsp;및&amp;nbsp;Android에서&amp;nbsp;모델을&amp;nbsp;실행할&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;예를&amp;nbsp;들어,&amp;nbsp;다음&amp;nbsp;코드&amp;nbsp;스니펫은&amp;nbsp;C++&amp;nbsp;추론&amp;nbsp;애플리케이션의&amp;nbsp;기본&amp;nbsp;구조를&amp;nbsp;보여줍니다.&lt;/p&gt;
&lt;p style=&quot;color: #5c5962; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #263238; color: #eeffff; text-align: start;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #546e7a;&quot;&gt;&amp;nbsp; &lt;span style=&quot;color: #c0d1e7;&quot;&gt;// Allocate ONNXRuntime session&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;&amp;nbsp; auto&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; memory_info &lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;Ort&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;MemoryInfo&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;CreateCpu&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;OrtDeviceAllocator&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; OrtMemTypeCPU&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&amp;nbsp; Ort&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;Env env&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&amp;nbsp; Ort&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;Session session&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;env&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;ORT_TSTR&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;model.onnx&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;),&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;Ort&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;SessionOptions&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;nullptr&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;}};&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #546e7a;&quot;&gt;&amp;nbsp;&lt;span style=&quot;color: #c0d1e7;&quot;&gt; // Allocate model inputs: fill in shape and size&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; std&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;array&lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;&amp;lt;float&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; ...&lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;input&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;{};&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; std&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;array&lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;int64_t&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; ...&lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;input_shape&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;...&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;};&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&amp;nbsp; Ort&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;Value input_tensor &lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;Ort&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;Value&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;CreateTensor&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;float&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;&amp;gt;(&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;memory_info&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; input&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;data&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;(),&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; input&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;size&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;(),&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; input_shape&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;data&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;(),&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&amp;nbsp; &amp;nbsp;input_shape&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;size&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;());&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;&amp;nbsp; const&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;char*&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;input_names&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;[] &lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;...&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;};&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #546e7a;&quot;&gt;&amp;nbsp; &lt;span style=&quot;color: #c0d1e7;&quot;&gt;// Allocate model outputs: fill in shape and size&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; std&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;array&lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;&amp;lt;float&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; ...&lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;output&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;{};&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; std&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;array&lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;int64_t&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; ...&lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;output_shape&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;...&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;};&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&amp;nbsp; Ort&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;Value output_tensor &lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;Ort&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;Value&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;CreateTensor&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;float&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;&amp;gt;(&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;memory_info&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; output&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;data&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;(),&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; output&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;size&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;(),&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; output_shape&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;data&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;(),&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; output_shape&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;size&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;());&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;&amp;nbsp; const&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;char*&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;output_names&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;[] &lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;...&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;};&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #546e7a;&quot;&gt;&amp;nbsp; &lt;span style=&quot;color: #c0d1e7;&quot;&gt;// Run the model&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&amp;nbsp; session_&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;Run&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;Ort&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;RunOptions{&lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;nullptr&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; input_names&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;input_tensor&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; output_names&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;output_tensor&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;color: #5c5962; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #5c5962; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;ONNXRuntime은&amp;nbsp;기본적으로&amp;nbsp;ONNX&amp;nbsp;그래프에&amp;nbsp;일련의&amp;nbsp;최적화를&amp;nbsp;적용하여&amp;nbsp;가능한&amp;nbsp;경우&amp;nbsp;노드를&amp;nbsp;결합하고&amp;nbsp;상수&amp;nbsp;값을&amp;nbsp;분리(상수&amp;nbsp;폴딩)합니다.&amp;nbsp;또한&amp;nbsp;ONNXRuntime은&amp;nbsp;실행&amp;nbsp;공급자&amp;nbsp;인터페이스를&amp;nbsp;통해&amp;nbsp;CUDA,&amp;nbsp;TensorRT,&amp;nbsp;OpenVINO,&amp;nbsp;CoreML,&amp;nbsp;NNAPI&amp;nbsp;등&amp;nbsp;다양한&amp;nbsp;하드웨어&amp;nbsp;가속기와&amp;nbsp;통합되며,&amp;nbsp;대상&amp;nbsp;하드웨어&amp;nbsp;플랫폼에&amp;nbsp;따라&amp;nbsp;사용할&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;가속기가&amp;nbsp;달라집니다.&lt;/p&gt;
&lt;p style=&quot;color: #5c5962; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #5c5962; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;ONNX&amp;nbsp;모델의&amp;nbsp;성능을&amp;nbsp;더욱&amp;nbsp;향상시키려면&amp;nbsp;양자화를&amp;nbsp;수행할&amp;nbsp;수&amp;nbsp;있습니다.&lt;/p&gt;
&lt;p style=&quot;color: #5c5962; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #5c5962; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;모바일이나&amp;nbsp;엣지&amp;nbsp;컴퓨팅과&amp;nbsp;같이&amp;nbsp;제약이&amp;nbsp;있는&amp;nbsp;환경에서&amp;nbsp;애플리케이션을&amp;nbsp;실행하는&amp;nbsp;경우,&amp;nbsp;애플리케이션에서&amp;nbsp;사용하는&amp;nbsp;모델&amp;nbsp;또는&amp;nbsp;모델&amp;nbsp;세트를&amp;nbsp;기반으로&amp;nbsp;크기를&amp;nbsp;줄인&amp;nbsp;런타임을&amp;nbsp;구축할&amp;nbsp;수&amp;nbsp;있습니다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p style=&quot;color: #5c5962; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;원하는&amp;nbsp;언어와&amp;nbsp;환경에서&amp;nbsp;시작하려면 &lt;a style=&quot;color: #226aca;&quot; href=&quot;https://onnxruntime.ai/docs/get-started/&quot;&gt;Get started with ONNX Runtime&lt;/a&gt;를&amp;nbsp;참조하세요.&lt;/p&gt;
&lt;p style=&quot;color: #5c5962; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #5c5962; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;예제&lt;/b&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h3 id=&quot;export-model-to-onnx&quot; style=&quot;color: #27262b; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;Export model to ONNX&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc; color: #5c5962; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a style=&quot;color: #226aca;&quot; href=&quot;https://pytorch.org/docs/stable/onnx.html&quot;&gt;Basic PyTorch export through torch.onnx&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a style=&quot;color: #226aca;&quot; href=&quot;https://pytorch.org/tutorials/advanced/super_resolution_with_onnxruntime.html&quot;&gt;Super-resolution with ONNX Runtime&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a style=&quot;color: #226aca;&quot; href=&quot;https://onnxruntime.ai/docs/tutorials/export-pytorch-model.html&quot;&gt;Export PyTorch model with custom ops&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;accelerated-inference-with-onnxruntime&quot; style=&quot;color: #27262b; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;Accelerated inference with ONNXRuntime&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc; color: #5c5962; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a style=&quot;color: #226aca;&quot; href=&quot;https://github.com/microsoft/onnxruntime/blob/main/onnxruntime/python/tools/transformers/notebooks/PyTorch_Bert-Squad_OnnxRuntime_CPU.ipynb&quot;&gt;Accelerate BERT model on CPU&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a style=&quot;color: #226aca;&quot; href=&quot;https://github.com/microsoft/onnxruntime/blob/main/onnxruntime/python/tools/transformers/notebooks/PyTorch_Bert-Squad_OnnxRuntime_GPU.ipynb&quot;&gt;Accelerate BERT model on GPU&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a style=&quot;color: #226aca;&quot; href=&quot;https://github.com/microsoft/onnxruntime-inference-examples/blob/main/quantization/notebooks/bert/Bert-GLUE_OnnxRuntime_quantization.ipynb&quot;&gt;Accelerate reduced size BERT model through quantization&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a style=&quot;color: #226aca;&quot; href=&quot;https://github.com/microsoft/onnxruntime/blob/main/onnxruntime/python/tools/transformers/notebooks/Inference_GPT2_with_OnnxRuntime_on_CPU.ipynb&quot;&gt;Accelerate GPT2 on CPU&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;resnet-50&quot; style=&quot;color: #27262b; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;RESNET-50&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc; color: #5c5962; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a style=&quot;color: #226aca;&quot; href=&quot;https://onnxruntime.ai/docs/tutorials/accelerate-pytorch/resnet-inferencing.html&quot;&gt;Accelerate RESNET-50 model on CPU, GPU, and OpenVINO&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp;요구 사항&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 모든 빌드에는 en_US.UTF-8 로케일이 포함된 영어 언어 패키지가 필요합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; Linux에서는 locale-gen en_US.UTF-8 및 update-locale LANG=en_US.UTF-8 명령을 실행하여 language-pack-en 패키지를 설치하십시오.&lt;br /&gt;&amp;nbsp; Windows 빌드에는 Visual C++ 2019 런타임이 필요합니다. 최신 버전을 권장합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&amp;nbsp; CUDA 및 cuDNN&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; ONNX Runtime GPU 패키지를 사용하려면 CUDA와 cuDNN을 설치해야 합니다. 호환되는 CUDA 및 cuDNN 버전은 CUDA 실행 공급자 요구 사항을 참조하십시오.&lt;br /&gt;zlib는&amp;nbsp;Linux용&amp;nbsp;cuDNN&amp;nbsp;9.x에서만&amp;nbsp;필요합니다(zlib는&amp;nbsp;cuDNN&amp;nbsp;9.x&amp;nbsp;Windows&amp;nbsp;동적&amp;nbsp;라이브러리에&amp;nbsp;정적으로&amp;nbsp;링크됨).&amp;nbsp;Linux&amp;nbsp;및&amp;nbsp;Windows용&amp;nbsp;cuDNN&amp;nbsp;8.x에서도&amp;nbsp;zlib가&amp;nbsp;필요합니다.&amp;nbsp;Linux&amp;nbsp;또는&amp;nbsp;Windows에&amp;nbsp;zlib를&amp;nbsp;설치하려면&amp;nbsp;cuDNN&amp;nbsp;8.9&amp;nbsp;설치&amp;nbsp;가이드를&amp;nbsp;따르십시오.&lt;br /&gt;Windows에서는&amp;nbsp;CUDA&amp;nbsp;bin&amp;nbsp;및&amp;nbsp;cuDNN&amp;nbsp;bin&amp;nbsp;디렉터리의&amp;nbsp;경로를&amp;nbsp;PATH&amp;nbsp;환경&amp;nbsp;변수에&amp;nbsp;추가해야&amp;nbsp;합니다.&amp;nbsp;Linux에서는&amp;nbsp;CUDA&amp;nbsp;lib64&amp;nbsp;및&amp;nbsp;cuDNN&amp;nbsp;lib&amp;nbsp;디렉터리의&amp;nbsp;경로를&amp;nbsp;LD_LIBRARY_PATH&amp;nbsp;환경&amp;nbsp;변수에&amp;nbsp;추가해야&amp;nbsp;합니다.&lt;br /&gt;onnxruntime-gpu&amp;nbsp;패키지의&amp;nbsp;경우,&amp;nbsp;CUDA&amp;nbsp;또는&amp;nbsp;cuDNN을&amp;nbsp;수동으로&amp;nbsp;설치하지&amp;nbsp;않고도&amp;nbsp;PyTorch와&amp;nbsp;함께&amp;nbsp;사용할&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;자세한&amp;nbsp;내용은&amp;nbsp;PyTorch와의&amp;nbsp;호환성을&amp;nbsp;참조하십시오.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Python&amp;nbsp;설치&lt;br /&gt;&lt;br /&gt;ONNX&amp;nbsp;Runtime&amp;nbsp;CPU&amp;nbsp;설치&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; 2.2 &amp;nbsp;Inference on multiple target&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1 id=&quot;inference-pytorch-models-on-different-hardware-targets-with-onnx-runtime&quot; style=&quot;color: #27262b; text-align: start;&quot;&gt;ONNX Runtime을 사용하여 다양한 하드웨어 환경에서 PyTorch 모델 추론하기&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;PyTorch&amp;nbsp;또는&amp;nbsp;ONNX&amp;nbsp;모델을&amp;nbsp;배포하고&amp;nbsp;성능과&amp;nbsp;하드웨어&amp;nbsp;유연성을&amp;nbsp;극대화하려는&amp;nbsp;개발자라면&amp;nbsp;ONNX&amp;nbsp;런타임을&amp;nbsp;활용하여&amp;nbsp;하드웨어&amp;nbsp;플랫폼에&amp;nbsp;최적화된&amp;nbsp;모델을&amp;nbsp;실행할&amp;nbsp;수&amp;nbsp;있습니다.&lt;br /&gt;&lt;br /&gt;이&amp;nbsp;튜토리얼에서는&amp;nbsp;다음&amp;nbsp;내용을&amp;nbsp;학습합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; (1) 이미지 분류를 위한 &lt;a style=&quot;color: #226aca;&quot; href=&quot;https://pytorch.org/vision/stable/models.html&quot;&gt;PyTorch&lt;/a&gt;&amp;nbsp;ResNet-50 모델 사용 방법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; (2) ONNX 형식으로 변환하는 방법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; (3) 동일한 애플리케이션 코드를 사용하여 모든 하드웨어 플랫폼에서 추론을 로드하고 실행하는 ONNX 런타임을 통해 기본 CPU, NVIDIA CUDA(GPU), Intel OpenVINO에 배포하는 방법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a style=&quot;color: #226aca;&quot; href=&quot;https://onnx.ai/&quot;&gt;ONNX&lt;/a&gt;는 Microsoft, Meta, Amazon 및 기타 기술 기업들이 머신 러닝 모델을 표준화하고 다양한 유형의 하드웨어에 쉽게 배포할 수 있도록 개발한 오픈 소스 ML 모델 형식입니다. &lt;a style=&quot;color: #226aca;&quot; href=&quot;https://onnxruntime.ai/&quot;&gt;ONNX Runtime&lt;/a&gt;&lt;span style=&quot;color: #5c5962; text-align: start;&quot;&gt;&lt;/span&gt;은 Microsoft에서 기여하고 유지 관리하며, PyTorch, TensorFlow 등의 프레임워크에서 ONNX 모델의 성능을 최적화합니다. ImageNet 데이터셋으로 학습된 ResNet-50 모델은 이미지 분류에 일반적으로 사용됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 튜토리얼에서는 &lt;a style=&quot;color: #226aca;&quot; href=&quot;https://azure.microsoft.com/en-us/services/machine-learning/&quot;&gt;Microsoft Azure Machine Learning&lt;/a&gt;&lt;span style=&quot;color: #5c5962; text-align: start;&quot;&gt;&lt;/span&gt;을 사용하여 OpenVINO 및 ONNX 런타임으로 CPU, GPU 및 Intel 하드웨어에서 ONNX 모델을 실행하는 방법을 보여줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;설정&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&amp;nbsp; 운영체제 필수 조건&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 환경에 &lt;a style=&quot;color: #226aca;&quot; href=&quot;https://curl.se/download.html&quot;&gt;curl&lt;/a&gt;&lt;span style=&quot;color: #5c5962; text-align: start;&quot;&gt;&lt;/span&gt;이 설치되어 있어야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&amp;nbsp; 장치 필수 조건(&lt;span style=&quot;color: #27262b; text-align: start;&quot;&gt;Device Prerequisites)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;onnxruntime-gpu 라이브러리는 장치 또는 컴퓨팅 클러스터의 &lt;a style=&quot;color: #226aca;&quot; href=&quot;https://docs.nvidia.com/cuda/cuda-installation-guide-microsoft-windows/index.html#:~:text=You%20can%20verify%20that%20you,that%20GPU%20is%20CUDA%2Dcapable.&quot;&gt;NVIDIA CUDA&lt;/a&gt;&amp;nbsp;가속기에 대한 액세스가 필요하지만, CPU 및 OpenVINO-CPU 데모는 CPU에서만 실행해도 작동합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&amp;nbsp; 추론 필수 조건(&lt;span style=&quot;color: #27262b; text-align: start;&quot;&gt;Inference Prerequisites&lt;/span&gt;&lt;span style=&quot;color: #27262b; text-align: start;&quot;&gt;)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추론할 이미지가 있는지 확인하십시오. 이 튜토리얼에서는 Notebook 파일과 같은 디렉터리에 &quot;cat.jpg&quot; 이미지가 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&amp;nbsp; 환경 필수 조건(&lt;span style=&quot;color: #27262b; text-align: start;&quot;&gt;Environment Prerequisites&lt;/span&gt;&lt;span style=&quot;color: #27262b; text-align: start;&quot;&gt;)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Azure Notebook 터미널 또는 AnaConda 프롬프트 창에서 다음 명령을 실행하여 CPU, GPU 및/또는 OpenVINO용 환경 3개를 생성합니다(차이점은 굵게 표시됨).&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CPU&lt;/p&gt;
&lt;div style=&quot;background-color: #263238; color: #eeffff; text-align: start;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; conda&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;create&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;-n&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;cpu_env_demo&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;python=&lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;3.8&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; conda&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;activate&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;cpu_env_demo&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; conda&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;install&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;-c&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;anaconda&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;ipykernel&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; conda&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;install&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;-c&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;conda-forge&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;ipywidgets&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; python&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;-m&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;ipykernel&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;install&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;--user&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;--name=cpu_env_demo&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; jupyter&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;notebook&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #5c5962; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #5c5962; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;GPU&lt;/p&gt;
&lt;div style=&quot;background-color: #263238; color: #eeffff; text-align: start;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; conda&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;create&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;-n&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;gpu_env_demo&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;python=&lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;3.8&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; conda&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;activate&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;gpu_env_demo&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; conda&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;install&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;-c&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;anaconda&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;ipykernel&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; conda&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;install&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;-c&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;conda-forge&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;ipywidgets&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; python&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;-m&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;ipykernel&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;install&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;--user&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;--name=gpu_env_demo&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; jupyter&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;notebook&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #5c5962; text-align: start;&quot;&gt;
&lt;div style=&quot;background-color: #ffffff; color: #5c5962;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;color: #5c5962; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;OpenVINO&lt;/p&gt;
&lt;div style=&quot;background-color: #263238; color: #eeffff; text-align: start;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; conda&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;create&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;-n&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;openvino_env_demo&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;python=&lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;3.8&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; conda&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;activate&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;openvino_env_demo&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; conda&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;install&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;-c&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;anaconda&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;ipykernel&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; conda&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;install&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;-c&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;conda-forge&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;ipywidgets&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; python&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;-m&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;ipykernel&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;install&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;--user&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;--name=openvino_env_demo&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; python&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;-m&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;pip&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;install&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;--upgrade&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;pip&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; pip&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;install&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;openvino&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #5c5962; text-align: start;&quot;&gt;
&lt;div style=&quot;background-color: #ffffff; color: #5c5962;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #5c5962;&quot;&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;라이브러리&amp;nbsp;요구&amp;nbsp;사항&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫 번째 코드 셀에서 다음 코드 조각을 사용하여 필요한 라이브러리를 설치하세요(차이점은 굵게 표시).&lt;/p&gt;
&lt;p style=&quot;color: #5c5962; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;color: #5c5962; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;CPU + GPU&lt;/p&gt;
&lt;div style=&quot;background-color: #263238; color: #eeffff; text-align: start;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&amp;nbsp; import sys&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;&amp;nbsp; if&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; sys&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;platform in &lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;'&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;linux&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;'&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;'&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;win32&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;'&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;: # Linux &lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;or&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; Windows&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;!&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: #f07178;&quot;&gt;sys&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #f07178;&quot;&gt;executable&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;m pip install torch&lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;==&lt;/span&gt;&lt;span style=&quot;color: #ff5370;&quot;&gt;1.9.0&lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;cu111 torchvision&lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;==&lt;/span&gt;&lt;span style=&quot;color: #ff5370;&quot;&gt;0.10.0&lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;cu111 torchaudio&lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;===&lt;/span&gt;&lt;span style=&quot;color: #ff5370;&quot;&gt;0.9.0&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;f https:&lt;/span&gt;&lt;span style=&quot;color: #546e7a;&quot;&gt;//download.pytorch.org/whl/torch_stable.html&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;&amp;nbsp; else&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;: # Mac&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;&lt;span style=&quot;background-color: #263238; color: #c792ea; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;print&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;PyTorch 1.9 MacOS Binaries do not support CUDA, install from source instead&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;&amp;nbsp; !&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: #f07178;&quot;&gt;sys&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #f07178;&quot;&gt;executable&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;m pip install onnxruntime&lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;gpu onnx onnxconverter_common&lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;==&lt;/span&gt;&lt;span style=&quot;color: #ff5370;&quot;&gt;1.8.1&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; pillow&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;color: #5c5962; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #5c5962; text-align: start;&quot;&gt;
&lt;div style=&quot;background-color: #ffffff; color: #5c5962;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;color: #5c5962; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;OpenVINO&lt;/p&gt;
&lt;div style=&quot;background-color: #263238; color: #eeffff; text-align: start;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&amp;nbsp; import sys&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;&amp;nbsp; if&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; sys&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;platform in &lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;'&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;linux&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;'&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;'&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;win32&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;'&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;: # Linux &lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;or&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; Windows&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;!&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: #f07178;&quot;&gt;sys&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #f07178;&quot;&gt;executable&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;m pip install torch&lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;==&lt;/span&gt;&lt;span style=&quot;color: #ff5370;&quot;&gt;1.9.0&lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;cu111 torchvision&lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;==&lt;/span&gt;&lt;span style=&quot;color: #ff5370;&quot;&gt;0.10.0&lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;cu111 torchaudio&lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;===&lt;/span&gt;&lt;span style=&quot;color: #ff5370;&quot;&gt;0.9.0&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;f https:&lt;/span&gt;&lt;span style=&quot;color: #546e7a;&quot;&gt;//download.pytorch.org/whl/torch_stable.html&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;&amp;nbsp; else&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;: # Mac&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;print&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;PyTorch 1.9 MacOS Binaries do not support CUDA, install from source instead&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;&amp;nbsp; !&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: #f07178;&quot;&gt;sys&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #f07178;&quot;&gt;executable&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;m pip install onnxruntime&lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;openvino onnx onnxconverter_common&lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;==&lt;/span&gt;&lt;span style=&quot;color: #ff5370;&quot;&gt;1.8.1&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; pillow&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&amp;nbsp; import openvino&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;utils as utils&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&amp;nbsp; utils&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;add_openvino_libs_to_path&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;()&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #5c5962; text-align: start;&quot;&gt;
&lt;div style=&quot;background-color: #ffffff; color: #5c5962;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #5c5962;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;h4 id=&quot;resnet-50-demo&quot; style=&quot;color: #27262b; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;ResNet-50 데모&lt;/b&gt;&lt;/h4&gt;
&lt;p id=&quot;environment-setup&quot; style=&quot;color: #27262b; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;환경 설정&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #5c5962; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #5c5962; text-align: start;&quot;&gt;모델을&amp;nbsp;가져오고&amp;nbsp;추론을&amp;nbsp;실행하는&amp;nbsp;데&amp;nbsp;필요한&amp;nbsp;라이브러리를&amp;nbsp;가져옵니다.&lt;/span&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #263238; color: #eeffff; text-align: start;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; from&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;torchvision&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;models,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;datasets,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;transforms&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;as&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;T&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; import&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;torch&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; from&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;PIL&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;Image&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; import&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;numpy&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;as&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;np&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;color: #5c5962; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #5c5962; text-align: start;&quot;&gt;
&lt;div style=&quot;background-color: #ffffff; color: #5c5962;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #5c5962;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p id=&quot;load-and-export-pre-trained-resnet-50-model-to-onnx&quot; style=&quot;color: #27262b; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;사전 학습된 ResNet-50 모델을 ONNX로 로드 및 내보내기&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #5c5962; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;PyTorch에서&amp;nbsp;사전&amp;nbsp;학습된&amp;nbsp;ResNet-50&amp;nbsp;모델을&amp;nbsp;다운로드하고&amp;nbsp;ONNX&amp;nbsp;형식으로&amp;nbsp;내보냅니다.&lt;/p&gt;
&lt;div style=&quot;background-color: #263238; color: #eeffff; text-align: start;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; resnet50&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;models.resnet50&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;pretrained&lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;True&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #546e7a;&quot;&gt;&amp;nbsp; # Download ImageNet labels&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;&amp;nbsp; !&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;curl&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;-o&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;imagenet_classes.txt&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;https://raw.githubusercontent.com/pytorch/hub/master/imagenet_classes.txt&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #546e7a;&quot;&gt;&amp;nbsp; # Read the categories&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; with&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;open&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&quot;imagenet_classes.txt&quot;&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;r&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;as&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;f:&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;categories&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; [s.strip() for s in f.readlines()]&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #546e7a;&quot;&gt;&amp;nbsp; # Export the model to ONNX&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; image_height&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;224&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; image_width&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;224&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; x&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;torch.randn&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;1,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;3,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;image_height,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;image_width,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;requires_grad=True&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; torch_out&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;resnet50&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;x&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; torch.onnx.export(resnet50,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #546e7a;&quot;&gt;# model being run&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;x,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #546e7a;&quot;&gt;# model input (or a tuple for multiple inputs)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&quot;resnet50.onnx&quot;&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #546e7a;&quot;&gt;# where to save the model (can be a file or file-like object)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;export_params&lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;True,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #546e7a;&quot;&gt;# store the trained parameter weights inside the model file&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;opset_version&lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;12,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #546e7a;&quot;&gt;# the ONNX version to export the model to&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;do_constant_folding&lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;True,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #546e7a;&quot;&gt;# whether to execute constant folding for optimization&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;input_names&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; [&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;'&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;input&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;'&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;], &lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #546e7a;&quot;&gt;# the model's input names&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;output_names&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; [&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;'&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;output&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;'&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;]) &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #546e7a;&quot;&gt;# the model's output names&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;color: #5c5962; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #5c5962; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;샘플&amp;nbsp;출력:&lt;/p&gt;
&lt;div style=&quot;background-color: #263238; color: #eeffff; text-align: start;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; %&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;Total&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;%&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;Received&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;%&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;Xferd&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;Average&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;Speed&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;Time&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;Time&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;Time&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;Current&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; Dload&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;Upload&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;Total&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;Spent&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;Left&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;Speed&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; 100&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;10472&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;100&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;10472&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;50581&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;--:--:--&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;--:--:--&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;--:--:--&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;50834&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;color: #5c5962; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #5c5962; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #5c5962; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #5c5962; text-align: start;&quot;&gt;추론을 위한 전처리 설정(Set up Pre-Processing for Inference&lt;span&gt; )&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #5c5962; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #5c5962; text-align: start;&quot;&gt;모델을 사용하여 추론할 이미지(예: cat.jpg)에 대한 전처리를 생성합니다.&lt;/span&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #263238; color: #eeffff; text-align: start;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c0d1e7;&quot;&gt;&amp;nbsp; # Pre-processing for ResNet-50 Inferencing, from https://pytorch.org/hub/pytorch_vision_resnet/&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;&amp;nbsp; resnet50.eval&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; filename&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;'&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;cat.jpg&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;'&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #c0d1e7;&quot;&gt;# change to your filename&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; input_image&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;Image.open&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;filename&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; preprocess&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;T.Compose&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;([&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;T.Resize&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;256&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;,&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&lt;span style=&quot;background-color: #263238; color: #eeffff; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;T.CenterCrop&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;224&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;,&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&lt;span style=&quot;background-color: #263238; color: #eeffff; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;T.ToTensor&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;,&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;span style=&quot;background-color: #263238; color: #eeffff; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;T.Normalize&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;mean&lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;485&lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;456&lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;406&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; std&lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;229&lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;224&lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;225&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;,&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;&amp;nbsp; ])&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; input_tensor&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;preprocess&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;input_image&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; input_batch&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;input_tensor.unsqueeze&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #c0d1e7;&quot;&gt;# create a mini-batch as expected by the model&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #c0d1e7;&quot;&gt;&amp;nbsp; # move the input and model to GPU for speed if available&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;&amp;nbsp; print&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&quot;GPU Availability: &quot;&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;torch.cuda.is_available&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;&amp;nbsp; if&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;torch.cuda.is_available&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;:&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;span style=&quot;background-color: #263238; color: #eeffff; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;input_batch&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;input_batch.to&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;'cuda'&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&lt;span style=&quot;background-color: #263238; color: #eeffff; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;resnet50.to(&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;'cuda'&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;color: #5c5962; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #5c5962; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #5c5962; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;샘플 출력:&lt;/p&gt;
&lt;div style=&quot;background-color: #263238; color: #eeffff; text-align: start;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; GPU&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;Availability:&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;False&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;color: #5c5962; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #5c5962; text-align: start;&quot;&gt;
&lt;div style=&quot;background-color: #ffffff; color: #5c5962;&quot;&gt;&lt;span style=&quot;color: #27262b; letter-spacing: 0px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h4 style=&quot;color: #5c5962; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;ONNX&amp;nbsp;런타임을&amp;nbsp;사용하여&amp;nbsp;ResNet-50&amp;nbsp;ONNX&amp;nbsp;모델&amp;nbsp;추론하기&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #5c5962; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;환경에&amp;nbsp;맞는&amp;nbsp;실행&amp;nbsp;공급자를&amp;nbsp;선택하여&amp;nbsp;ONNX&amp;nbsp;런타임으로&amp;nbsp;모델을&amp;nbsp;추론합니다.&amp;nbsp;CPU를&amp;nbsp;사용하는&amp;nbsp;환경이라면&amp;nbsp;CPUExecutionProvider의&amp;nbsp;주석을&amp;nbsp;해제하고,&amp;nbsp;NVIDIA&amp;nbsp;CUDA를&amp;nbsp;사용하는&amp;nbsp;환경이라면&amp;nbsp;CUDAExecutionProvider의&amp;nbsp;주석을&amp;nbsp;해제하고,&amp;nbsp;OpenVINOExecutionProvider를&amp;nbsp;사용하는&amp;nbsp;환경이라면&amp;nbsp;OpenVINOExecutionProvider의&amp;nbsp;주석을&amp;nbsp;해제합니다.&amp;nbsp;이때&amp;nbsp;onnxruntime.InferenceSession의&amp;nbsp;나머지&amp;nbsp;코드는&amp;nbsp;주석&amp;nbsp;처리해야&amp;nbsp;합니다.&lt;/p&gt;
&lt;div style=&quot;background-color: #263238; color: #eeffff; text-align: start;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c0d1e7;&quot;&gt;&amp;nbsp; # Inference with ONNX Runtime&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; import&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;onnxruntime&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; from&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;onnx&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;numpy_helper&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; import&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;time&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; session_fp32&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;onnxruntime.InferenceSession&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&quot;resnet50.onnx&quot;&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;providers=[&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;'&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;CPUExecutionProvider&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;'&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #546e7a;&quot;&gt;&amp;nbsp; &lt;span style=&quot;color: #c0d1e7;&quot;&gt;# session_fp32 = onnxruntime.InferenceSession(&quot;resnet50.onnx&quot;, providers=['CUDAExecutionProvider'])&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c0d1e7;&quot;&gt;&amp;nbsp; # session_fp32 = onnxruntime.InferenceSession(&quot;resnet50.onnx&quot;, providers=['OpenVINOExecutionProvider'])&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; def&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;softmax&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;x&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;:&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&quot;&quot;&quot;Compute softmax values for each sets of scores in x.&quot;&quot;&quot;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;e_x&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;np.exp&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;x&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;np.max&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;x&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;))&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;return&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;e_x&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;e_x.sum&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;()&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; latency&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; []&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; def&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;run_sample&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;session,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;image_file,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;categories,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;inputs&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;:&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;start&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;time.time&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;()&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;input_arr&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;inputs.cpu&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;.detach&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;.numpy&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;()&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;ort_outputs&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;session.run&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;([]&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;'input'&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;:input_arr}&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;]&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;latency.append(time.time(&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;) - start)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;output&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;ort_outputs.flatten&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;()&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;output&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;softmax&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;output&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #c0d1e7;&quot;&gt;# this is optional&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;top5_catid&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;np.argsort&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;-output&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;[:5]&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;for&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; catid &lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;top5_catid:&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;print&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;categories[catid],&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;output[catid]&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;return&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;ort_outputs&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; ort_output&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;run_sample&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;session_fp32,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;'&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;cat.jpg&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;'&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;categories,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;input_batch&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;&amp;nbsp; print&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&quot;ONNX Runtime CPU/GPU/OpenVINO Inference time = {} ms&quot;&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;.format(format(sum(latency&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; 1000 / len(&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;latency&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;), &lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;'&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;.2f&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;'&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;)))&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;color: #5c5962; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #5c5962; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;샘플 출력:&lt;/p&gt;
&lt;div style=&quot;background-color: #263238; color: #eeffff; text-align: start;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&amp;nbsp; Egyptian cat &lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;0.78605634&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&amp;nbsp; tabby &lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;0.117310025&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&amp;nbsp; tiger cat &lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;0.020089425&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&amp;nbsp; Siamese cat &lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;0.011728076&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&amp;nbsp; plastic bag &lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;0.0052174763&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&amp;nbsp; ONNX Runtime CPU Inference time &lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;32.34&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; ms&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id=&quot;comparison-with-pytorch&quot; style=&quot;color: #27262b; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h4 style=&quot;color: #5c5962; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;PyTorch와의&amp;nbsp;비교&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #5c5962; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;PyTorch를 사용하여 ONNX 런타임의 CPU 및 GPU 정확도와 지연 시간을 벤치마킹해 보세요.&lt;/p&gt;
&lt;div style=&quot;background-color: #263238; color: #eeffff; text-align: start;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c0d1e7;&quot;&gt;&amp;nbsp; # Inference with PyTorch&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; latency&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; []&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; start&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;time.time&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;()&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; with&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;torch.no_grad&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;:&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;torch_output&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;resnet50&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;input_batch&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; latency.append(time.time(&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;) - start)&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #c0d1e7;&quot;&gt;&amp;nbsp; # Convert to numpy&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; torch_output_np&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;torch_output.cpu&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;.detach&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;.numpy&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;()&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #c0d1e7;&quot;&gt;&amp;nbsp; # Print classification results&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; output&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;torch_output_np.flatten&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;()&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; output&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;softmax&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;output&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; top5_catid&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;np.argsort&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;-output&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;[:5]&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;&amp;nbsp; for&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; catid &lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;top5_catid:&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;print&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;categories[catid],&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;output[catid]&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;&amp;nbsp; print&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&quot;PyTorch CPU Inference time = {} ms&quot;&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;.format(format(sum(latency&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; 1000 / len(&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;latency&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;), &lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;'&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;.2f&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;'&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;)))&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;&amp;nbsp; print&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&quot;***** Verifying correctness *****&quot;&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;&amp;nbsp; for&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; i &lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;range&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;:&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;print&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;'PyTorch and ONNX Runtime output {} are close:'&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;.format(i&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;), np.allclose(&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;ort_output,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;torch_output_np,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;rtol=1e-05,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;atol=1e-04&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;))&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;color: #5c5962; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #5c5962; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;샘플 출력:&lt;/p&gt;
&lt;div style=&quot;background-color: #263238; color: #eeffff; text-align: start;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; Egyptian&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;cat&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;0.78605634&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; tabby&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;0.117310025&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; tiger&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;cat&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;0.020089425&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; Siamese&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;cat&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;0.011728076&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; plastic&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;bag&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;0.0052174763&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; PyTorch&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;CPU&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;Inference&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;time&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;34.56&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;ms&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;&amp;nbsp; *****&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; Verifying correctness &lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;*****&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; PyTorch&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;and&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;ONNX&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;Runtime&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;output&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;are&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;close:&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;True&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; PyTorch&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;and&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;ONNX&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;Runtime&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;output&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;are&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;close:&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;True&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #5c5962; text-align: start;&quot;&gt;
&lt;div style=&quot;background-color: #ffffff; color: #5c5962;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id=&quot;comparison-with-openvino&quot; style=&quot;color: #27262b; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h4 style=&quot;color: #5c5962; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;OpenVINO와의&amp;nbsp;비교&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #5c5962; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;OpenVINO를 사용하여 ONNX 런타임과 OpenVINO의 정확도 및 지연 시간을 비교 평가합니다.&lt;/p&gt;
&lt;div style=&quot;background-color: #263238; color: #eeffff; text-align: start;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #546e7a;&quot;&gt;&amp;nbsp; # Inference with OpenVINO&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; from&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;openvino.runtime&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;Core&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; ie&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;Core&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;()&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; onnx_model_path&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;./resnet50.onnx&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;&quot;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; model_onnx&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;ie.read_model&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;model&lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;onnx_model_path&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; compiled_model_onnx&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;ie.compile_model&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;model&lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;model_onnx,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; device_name&lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;CPU&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #546e7a;&quot;&gt;&amp;nbsp; # inference&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; output_layer&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;next&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;iter(compiled_model_onnx.outputs&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; latency&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; []&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; input_arr&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;input_batch.detach&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;.numpy&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;()&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; inputs&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;'&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;input&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;'&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;:input_arr}&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; start&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;time.time&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;()&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; request&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;compiled_model_onnx.create_infer_request&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;()&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; output&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;request.infer&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;inputs&lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;inputs&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; outputs&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;request.get_output_tensor&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;output_layer.index&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;.data&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; latency.append(time.time(&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;) - start)&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;&amp;nbsp; print&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&quot;OpenVINO CPU Inference time = {} ms&quot;&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;.format(format(sum(latency&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; 1000 / len(&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;latency&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;), &lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;'&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;.2f&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;'&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;)))&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;&amp;nbsp; print&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&quot;***** Verifying correctness *****&quot;&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;&amp;nbsp; for&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; i &lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;range&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;:&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;print&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;'OpenVINO and ONNX Runtime output {} are close:'&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;.format(i&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;), np.allclose(&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;ort_output,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;outputs,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;rtol=1e-05,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;atol=1e-04&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;))&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;color: #5c5962; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #5c5962; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #5c5962; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;샘플 출력:&lt;/p&gt;
&lt;p style=&quot;color: #5c5962; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #5c5962; text-align: start;&quot;&gt;
&lt;div style=&quot;background-color: #ffffff; color: #5c5962;&quot;&gt;
&lt;pre class=&quot;yaml&quot; style=&quot;background-color: #ffffff; color: #5c5962;&quot;&gt;&lt;code&gt;Egyptian cat 0.7820879
tabby 0.113261245
tiger cat 0.020114701
Siamese cat 0.012514038
plastic bag 0.0056432663
OpenVINO CPU Inference time = 31.83 ms
***** Verifying correctness *****
PyTorch and ONNX Runtime output 0 are close: True
PyTorch and ONNX Runtime output 1 are close: True
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&quot;conclusion&quot; style=&quot;color: #27262b; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;Conclusion&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/h2&gt;
&lt;h4 style=&quot;color: #5c5962; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;결론&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #5c5962; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;ONNX Runtime은 CPU, NVIDIA CUDA(GPU), Intel OpenVINO(모바일)에서 PyTorch 또는 ONNX 모델을 실행하는 효과적인 방법임을 입증했습니다. ONNX Runtime을 사용하면 실행 공급자(&lt;a style=&quot;color: #226aca;&quot; href=&quot;https://onnxruntime.ai/docs/execution-providers/CoreML-ExecutionProvider.html&quot;&gt;Execution Providers&lt;/a&gt;)에서 제공하는 더 다양한 하드웨어에 배포할 수 있습니다. ONNX Runtime &lt;a style=&quot;color: #226aca;&quot; href=&quot;https://github.com/microsoft/onnxruntime&quot;&gt;Github repo&lt;/a&gt;에 참여하여 여러분의 의견을 들려주시면 감사하겠습니다.&lt;/p&gt;
&lt;p style=&quot;color: #5c5962; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #5c5962; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;비디오&amp;nbsp;데모&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #5c5962; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;ResNet-50 배포 및 유연한 추론에 대한 자세한 설명과 단계별 가이드는 &lt;a style=&quot;color: #226aca;&quot; href=&quot;https://www.youtube.com/embed/sbc3Bmv2Kwo?feature=oembed&quot;&gt;여기&lt;/a&gt;에서 비디오를 시청하세요.&lt;/p&gt;
&lt;p style=&quot;color: #5c5962; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; 1.3 &amp;nbsp;Accelerate PyTorch Training&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;ORTModule Examples&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; color: #5c5962; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a style=&quot;color: #226aca;&quot; href=&quot;https://github.com/microsoft/onnxruntime-training-examples/tree/master/huggingface&quot;&gt;Use ORTModule with HuggingFace Models&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;border-left: #0B2161 10px solid; padding-right: 10px; border-bottom: #0B2161 2px solid; pading-bottom: px; padding-top: 0px; margin: 10px 0px 5px; line-height: 30px;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;b&gt;2. &amp;nbsp;Accelating TensorFlow&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;h1 id=&quot;accelerate-tensorflow-model-inferencing&quot; style=&quot;color: #27262b; text-align: start;&quot;&gt;Accelerate TensorFlow model inferencing&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/h1&gt;
&lt;p style=&quot;color: #5c5962; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;ONNX&amp;nbsp;런타임은&amp;nbsp;TensorFlow,&amp;nbsp;TFLite&amp;nbsp;및&amp;nbsp;Keras&amp;nbsp;모델의&amp;nbsp;추론&amp;nbsp;시간을&amp;nbsp;단축할&amp;nbsp;수&amp;nbsp;있습니다.&lt;/p&gt;
&lt;p style=&quot;color: #5c5962; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #5c5962; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;get-started&quot; style=&quot;color: #27262b; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;Get Started&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc; color: #5c5962; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a style=&quot;color: #226aca;&quot; href=&quot;https://onnxruntime.ai/docs/tutorials/tf-get-started.html&quot;&gt;End to end: Run TensorFlow models in ONNX Runtime&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;export-model-to-onnx&quot; style=&quot;color: #27262b; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;Export model to ONNX&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/h2&gt;
&lt;h3 id=&quot;tensorflowkeras&quot; style=&quot;color: #27262b; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;TensorFlow/Keras&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #5c5962; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;These examples use the&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;color: #226aca;&quot; href=&quot;https://github.com/onnx/tensorflow-onnx&quot;&gt;TensorFlow-ONNX converter&lt;/a&gt;, which supports TensorFlow 1, 2, Keras, and TFLite model formats.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #5c5962; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a style=&quot;color: #226aca;&quot; href=&quot;https://github.com/onnx/tensorflow-onnx/blob/master/tutorials/efficientdet.ipynb&quot;&gt;TensorFlow: Object detection (efficentdet)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a style=&quot;color: #226aca;&quot; href=&quot;https://github.com/onnx/tensorflow-onnx/blob/master/tutorials/ConvertingSSDMobilenetToONNX.ipynb&quot;&gt;TensorFlow: Object detection (SSD Mobilenet)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a style=&quot;color: #226aca;&quot; href=&quot;https://github.com/onnx/tensorflow-onnx/blob/master/tutorials/efficientnet-edge.ipynb&quot;&gt;TensorFlow: Image classification (efficientnet-edge)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a style=&quot;color: #226aca;&quot; href=&quot;https://github.com/onnx/tensorflow-onnx/blob/master/tutorials/efficientnet-lite.ipynb&quot;&gt;TensorFlow: Image classification (efficientnet-lite)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a style=&quot;color: #226aca;&quot; href=&quot;https://github.com/onnx/tensorflow-onnx/blob/master/tutorials/BertTutorial.ipynb&quot;&gt;TensorFlow: Natural Language Processing (BERT)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a style=&quot;color: #226aca;&quot; href=&quot;https://github.com/microsoft/onnxruntime/blob/main/onnxruntime/python/tools/transformers/notebooks/Tensorflow_Tf2onnx_Bert-Squad_OnnxRuntime_CPU.ipynb&quot;&gt;TensorFlow: Accelerate BERT model&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a style=&quot;color: #226aca;&quot; href=&quot;https://github.com/onnx/tensorflow-onnx/blob/master/tutorials/keras-resnet50.ipynb&quot;&gt;Keras: Image classification (Resnet 50)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;tflite&quot; style=&quot;color: #27262b; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;TFLite&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc; color: #5c5962; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a style=&quot;color: #226aca;&quot; href=&quot;https://github.com/onnx/tensorflow-onnx/blob/master/tutorials/mobiledet-tflite.ipynb&quot;&gt;TFLite: Image classification (mobiledet)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;border-left: #0B2161 10px solid; padding-right: 10px; border-bottom: #0B2161 2px solid; pading-bottom: px; padding-top: 0px; margin: 10px 0px 5px; line-height: 30px;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;b&gt;3. &amp;nbsp;Accelerate Hugging Face models&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #5c5962; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #5c5962; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #5c5962; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;ONNX Runtime can accelerate training and inferencing popular Hugging Face NLP models.&lt;/p&gt;
&lt;p style=&quot;color: #5c5962; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; 1.1&amp;nbsp; Yocto Project 소개&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #5c5962; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;accelerate-hugging-face-model-inferencing&quot; style=&quot;color: #27262b; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;Accelerate Hugging Face model inferencing&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc; color: #5c5962; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a style=&quot;color: #226aca;&quot; href=&quot;https://github.com/huggingface/notebooks/blob/master/examples/onnx-export.ipynb&quot;&gt;General export and inference: Hugging Face Transformers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a style=&quot;color: #226aca;&quot; href=&quot;https://github.com/microsoft/onnxruntime/blob/main/onnxruntime/python/tools/transformers/notebooks/Inference_GPT2_with_OnnxRuntime_on_CPU.ipynb&quot;&gt;Accelerate GPT2 model on CPU&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a style=&quot;color: #226aca;&quot; href=&quot;https://github.com/microsoft/onnxruntime/blob/main/onnxruntime/python/tools/transformers/notebooks/PyTorch_Bert-Squad_OnnxRuntime_CPU.ipynb&quot;&gt;Accelerate BERT model on CPU&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a style=&quot;color: #226aca;&quot; href=&quot;https://github.com/microsoft/onnxruntime/blob/main/onnxruntime/python/tools/transformers/notebooks/PyTorch_Bert-Squad_OnnxRuntime_GPU.ipynb&quot;&gt;Accelerate BERT model on GPU&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;additional-resources&quot; style=&quot;color: #27262b; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;Additional resources&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc; color: #5c5962; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a style=&quot;color: #226aca;&quot; href=&quot;https://medium.com/microsoftazure/faster-and-smaller-quantized-nlp-with-hugging-face-and-onnx-runtime-ec5525473bb7&quot;&gt;Blog post: Faster and smaller quantized NLP with Hugging Face and ONNX Runtime&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a style=&quot;color: #226aca;&quot; href=&quot;https://medium.com/microsoftazure/accelerate-your-nlp-pipelines-using-hugging-face-transformers-and-onnx-runtime-2443578f4333&quot;&gt;Blog post: Accelerate your NLP pipelines using Hugging Face Transformers and ONNX Runtime&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;border-left: #0B2161 10px solid; padding-right: 10px; border-bottom: #0B2161 2px solid; pading-bottom: px; padding-top: 0px; margin: 10px 0px 5px; line-height: 30px;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;b&gt;4. AzureML에서 ONNX 런타임을 사용하여 고성능 질의응답 모델 배포하기&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이&amp;nbsp;튜토리얼에서는&amp;nbsp;HuggingFace의&amp;nbsp;BERT&amp;nbsp;모델을&amp;nbsp;ONNX로&amp;nbsp;변환하고,&amp;nbsp;AzureML을&amp;nbsp;통해&amp;nbsp;ONNX&amp;nbsp;런타임과&amp;nbsp;함께&amp;nbsp;ONNX&amp;nbsp;모델을&amp;nbsp;배포하는&amp;nbsp;방법을&amp;nbsp;설명합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음&amp;nbsp;섹션에서는&amp;nbsp;Stanford&amp;nbsp;Question&amp;nbsp;Answering&amp;nbsp;Dataset(SQuAD)&amp;nbsp;데이터셋으로&amp;nbsp;학습된&amp;nbsp;HuggingFace&amp;nbsp;BERT&amp;nbsp;모델을&amp;nbsp;예시로&amp;nbsp;사용합니다.&amp;nbsp;자신만의&amp;nbsp;질의응답&amp;nbsp;모델을&amp;nbsp;학습시키거나&amp;nbsp;미세&amp;nbsp;조정할&amp;nbsp;수도&amp;nbsp;있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;질의응답&amp;nbsp;시나리오는&amp;nbsp;질문과&amp;nbsp;컨텍스트라는&amp;nbsp;텍스트&amp;nbsp;조각을&amp;nbsp;입력으로&amp;nbsp;받아&amp;nbsp;컨텍스트에서&amp;nbsp;추출한&amp;nbsp;텍스트&amp;nbsp;문자열인&amp;nbsp;답변을&amp;nbsp;생성합니다.&amp;nbsp;이&amp;nbsp;시나리오는&amp;nbsp;질문과&amp;nbsp;컨텍스트를&amp;nbsp;토큰화&amp;nbsp;및&amp;nbsp;인코딩하고,&amp;nbsp;입력값을&amp;nbsp;변환기&amp;nbsp;모델에&amp;nbsp;입력하여&amp;nbsp;컨텍스트에서&amp;nbsp;가장&amp;nbsp;가능성이&amp;nbsp;높은&amp;nbsp;시작&amp;nbsp;및&amp;nbsp;끝&amp;nbsp;토큰을&amp;nbsp;생성한&amp;nbsp;다음,&amp;nbsp;이를&amp;nbsp;다시&amp;nbsp;단어로&amp;nbsp;매핑하여&amp;nbsp;답변을&amp;nbsp;생성합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1854&quot; data-origin-height=&quot;1324&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IsbQr/dJMcabKRhsj/lyNRz3Pzh5TMnielYGTYFk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IsbQr/dJMcabKRhsj/lyNRz3Pzh5TMnielYGTYFk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IsbQr/dJMcabKRhsj/lyNRz3Pzh5TMnielYGTYFk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIsbQr%2FdJMcabKRhsj%2FlyNRz3Pzh5TMnielYGTYFk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1854&quot; height=&quot;1324&quot; data-origin-width=&quot;1854&quot; data-origin-height=&quot;1324&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런&amp;nbsp;다음&amp;nbsp;모델과&amp;nbsp;스코어링&amp;nbsp;코드가&amp;nbsp;온라인&amp;nbsp;엔드포인트를&amp;nbsp;사용하여&amp;nbsp;AzureML에&amp;nbsp;배포됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;목차&lt;/b&gt;&lt;/h4&gt;
&lt;ul id=&quot;markdown-toc&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a id=&quot;markdown-toc-pre-requisites&quot; style=&quot;color: #226aca;&quot; href=&quot;https://onnxruntime.ai/docs/tutorials/azureml.html#pre-requisites&quot;&gt;사전 요구사항(Pre-requisites)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a id=&quot;markdown-toc-environment&quot; style=&quot;color: #226aca;&quot; href=&quot;https://onnxruntime.ai/docs/tutorials/azureml.html#environment&quot;&gt;환경(Environment)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a id=&quot;markdown-toc-obtain-and-convert-pytorch-model-to-onnx-format&quot; style=&quot;color: #226aca;&quot; href=&quot;https://onnxruntime.ai/docs/tutorials/azureml.html#obtain-and-convert-pytorch-model-to-onnx-format&quot;&gt;PyTorch 모델을 가져와 ONNX 형식으로 변환(Obtain and convert PyTorch model to ONNX format)&lt;/a&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a id=&quot;markdown-toc-export-the-model&quot; style=&quot;color: #226aca;&quot; href=&quot;https://onnxruntime.ai/docs/tutorials/azureml.html#export-the-model&quot;&gt;모델 내보내기(Export the model)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a id=&quot;markdown-toc-run-the-onnx-model-with-onnx-runtime&quot; style=&quot;color: #226aca;&quot; href=&quot;https://onnxruntime.ai/docs/tutorials/azureml.html#run-the-onnx-model-with-onnx-runtime&quot;&gt;ONNX Runtime을 사용하여 ONNX 모델 실행(Run the ONNX model with ONNX Runtime)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a id=&quot;markdown-toc-deploy-model-with-onnx-runtime-through-azureml&quot; style=&quot;color: #226aca;&quot; href=&quot;https://onnxruntime.ai/docs/tutorials/azureml.html#deploy-model-with-onnx-runtime-through-azureml&quot;&gt;AzureML을 통해 ONNX 런타임을 사용하여 모델 배포(Deploy model with ONNX Runtime through AzureML)&lt;/a&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a id=&quot;markdown-toc-check-your-environment&quot; style=&quot;color: #226aca;&quot; href=&quot;https://onnxruntime.ai/docs/tutorials/azureml.html#check-your-environment&quot;&gt;환경 확인(Check your environment)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a id=&quot;markdown-toc-load-your-azure-ml-workspace&quot; style=&quot;color: #226aca;&quot; href=&quot;https://onnxruntime.ai/docs/tutorials/azureml.html#load-your-azure-ml-workspace&quot;&gt;Azure&amp;nbsp;ML&amp;nbsp;작업&amp;nbsp;영역&amp;nbsp;로드(Load your Azure ML workspace)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a id=&quot;markdown-toc-display-your-registered-models&quot; style=&quot;color: #226aca;&quot; href=&quot;https://onnxruntime.ai/docs/tutorials/azureml.html#display-your-registered-models&quot;&gt;등록된&amp;nbsp;모델&amp;nbsp;표시(Display your registered models)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a id=&quot;markdown-toc-deploy-the-model-and-scoring-code-as-an-azureml-endpoint&quot; style=&quot;color: #226aca;&quot; href=&quot;https://onnxruntime.ai/docs/tutorials/azureml.html#deploy-the-model-and-scoring-code-as-an-azureml-endpoint&quot;&gt;모델 및 스코어링 코드를 AzureML 엔드포인트로 배포(Deploy the model and scoring code as an AzureML endpoint)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a id=&quot;markdown-toc-test-the-deployed-endpoint&quot; style=&quot;color: #226aca;&quot; href=&quot;https://onnxruntime.ai/docs/tutorials/azureml.html#test-the-deployed-endpoint&quot;&gt;배포된 엔드포인트 테스트(Test the deployed endpoint)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a id=&quot;markdown-toc-clean-up-azure-resources&quot; style=&quot;color: #226aca;&quot; href=&quot;https://onnxruntime.ai/docs/tutorials/azureml.html#clean-up-azure-resources&quot;&gt;Azure 리소스 정리(Clean up Azure resources)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;필수&amp;nbsp;조건&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 &lt;a style=&quot;color: #226aca;&quot; href=&quot;https://github.com/microsoft/onnxruntime-inference-examples/tree/main/python/azureml&quot;&gt;튜토리얼의 소스 코드&lt;/a&gt;는 GitHub에 게시되어 있습니다.&lt;br /&gt;AzureML에서&amp;nbsp;실행하려면&amp;nbsp;다음이&amp;nbsp;필요합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;Azure&amp;nbsp;구독&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;Azure&amp;nbsp;Machine&amp;nbsp;Learning&amp;nbsp;작업&amp;nbsp;영역(작업&amp;nbsp;영역이&amp;nbsp;없는&amp;nbsp;경우 &lt;a style=&quot;color: #226aca;&quot; href=&quot;https://github.com/Azure/MachineLearningNotebooks/blob/56e0ebc5acb9614fac51d8b98ede5acee8003820/configuration.ipynb&quot;&gt;the AzureML configuration notebook&lt;/a&gt;을&amp;nbsp;참조하여&amp;nbsp;작업&amp;nbsp;영역을&amp;nbsp;생성하세요.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;Azure&amp;nbsp;Machine&amp;nbsp;Learning&amp;nbsp;SDK&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;Azure&amp;nbsp;CLI&amp;nbsp;및&amp;nbsp;Azure&amp;nbsp;Machine&amp;nbsp;Learning&amp;nbsp;CLI&amp;nbsp;확장&amp;nbsp;프로그램(버전&amp;nbsp;2.2.2&amp;nbsp;이상)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음&amp;nbsp;리소스도&amp;nbsp;유용할&amp;nbsp;수&amp;nbsp;있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;Azure Machine Learning &lt;a style=&quot;color: #226aca;&quot; href=&quot;https://docs.microsoft.com/azure/machine-learning/service/concept-azure-machine-learning-architecture&quot;&gt;아키텍처 및 용어(architecture and terms)&lt;/a&gt;&amp;nbsp;이해&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;a style=&quot;color: #226aca;&quot; href=&quot;https://portal.azure.com/&quot;&gt;Azure Portal&lt;/a&gt;에서 배포 상태를 추적할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AzureML&amp;nbsp;구독에&amp;nbsp;액세스할&amp;nbsp;수&amp;nbsp;없는&amp;nbsp;경우&amp;nbsp;이&amp;nbsp;자습서를&amp;nbsp;로컬에서&amp;nbsp;실행할&amp;nbsp;수&amp;nbsp;있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;환경&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;의존성을 직접 설치하려면 다음 명령을 실행하세요.&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;background-color: #263238; color: #eeffff; text-align: start;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; pip&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;install&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;torch&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; pip&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;install&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;transformers&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; pip&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;install&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;azureml&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;azureml.core&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; pip&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;install&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;onnxruntime&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; pip&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;install&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;matplotlib&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;conda&amp;nbsp;환경에서&amp;nbsp;Jupyter&amp;nbsp;커널을&amp;nbsp;생성하려면&amp;nbsp;다음&amp;nbsp;명령을&amp;nbsp;실행하세요.&amp;nbsp;&amp;lt;kernel&amp;nbsp;name&amp;gt;을&amp;nbsp;생성한&amp;nbsp;커널&amp;nbsp;이름으로&amp;nbsp;바꾸세요.&lt;/p&gt;
&lt;div style=&quot;background-color: #263238; color: #eeffff; text-align: start;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; conda&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;install&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;-c&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;anaconda&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;ipykernel&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; python&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;-m&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;ipykernel&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;install&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;--user&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;--name=&lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;kernel&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;아래 배포 단계에서 사용되는 AzureML CLI 확장 프로그램을 설치하세요.&lt;/p&gt;
&lt;div style=&quot;background-color: #263238; color: #eeffff; text-align: start;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; az&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;login&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; az&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;extension&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;add&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;--name&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;ml&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #546e7a;&quot;&gt;&amp;nbsp; &lt;span style=&quot;color: #c0d1e7;&quot;&gt;# azure-cli-ml 확장 프로그램이 설치되어 있으면 제거하세요. az ml 확장 프로그램과 호환되지 않습니다.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; az&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;extension&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;remove&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;azure-cli-ml&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;PyTorch 모델을 가져와 ONNX 형식으로 변환&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 코드에서는 HuggingFace의 SQUAD 데이터셋을 사용하여 질문 답변에 최적화된 BERT 모델을 가져옵니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;BERT 모델을 처음부터 사전 학습하려면 &lt;a style=&quot;color: #226aca;&quot; href=&quot;https://github.com/microsoft/AzureML-BERT/blob/master/pretrain/PyTorch/notebooks/BERT_Pretrain.ipynb&quot;&gt;Pre-train BERT model&lt;/a&gt;의 지침을 따르세요. 자체 데이터셋으로 모델을 미세 조정하려면 &lt;a style=&quot;color: #226aca;&quot; href=&quot;https://github.com/microsoft/AzureML-BERT/blob/master/finetune/PyTorch/notebooks/BERT_Eval_SQUAD.ipynb&quot;&gt;AzureML BERT Eval Squa&lt;/a&gt; 또는 &lt;a style=&quot;color: #226aca;&quot; href=&quot;https://github.com/microsoft/AzureML-BERT/blob/master/finetune/PyTorch/notebooks/BERT_Eval_GLUE.ipynb&quot;&gt;AzureML BERT Eval GLUE&lt;/a&gt;를 참조하세요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;모델&amp;nbsp;내보내기&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PyTorch ONNX 익스포터를 사용하여 ONNX 런타임에서 실행할 수 있는 ONNX 형식의 모델을 생성합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #263238; color: #eeffff; text-align: start;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; import&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;torch&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; from&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;transformers&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;BertForQuestionAnswering&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; model_name&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;bert-large-uncased-whole-word-masking-finetuned-squad&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;&quot;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; model_path&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;./&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;model_name&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;.onnx&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;&quot;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; model&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;BertForQuestionAnswering.from_pretrained&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;model_name&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #c0d1e7;&quot;&gt;&amp;nbsp; # 모델을 추론 모드로 설정 (set the model to inference mode)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c0d1e7;&quot;&gt;&amp;nbsp; # 모델을 내보내기 전에 torch_model.eval() 또는 torch_model.train(False)를 호출하는 것이 중요합니다. &lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c0d1e7;&quot;&gt;&amp;nbsp; # &amp;nbsp;(It is important to call torch_model.eval() or torch_model.train(False) before exporting the model)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c0d1e7;&quot;&gt;&amp;nbsp; #&amp;nbsp;드롭아웃이나&amp;nbsp;배치&amp;nbsp;정규화와&amp;nbsp;같은&amp;nbsp;연산자는&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c0d1e7;&quot;&gt;&amp;nbsp; #&amp;nbsp;추론&amp;nbsp;모드와&amp;nbsp;학습&amp;nbsp;모드에서&amp;nbsp;다르게&amp;nbsp;동작하기&amp;nbsp;때문에&amp;nbsp;모델을&amp;nbsp;추론&amp;nbsp;모드로&amp;nbsp;전환해야&amp;nbsp;합니다.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c0d1e7;&quot;&gt;&amp;nbsp; # &amp;nbsp;(to turn the model to inference mode. This is required since operators like dropout or batchnorm)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c0d1e7;&quot;&gt;&amp;nbsp; # &amp;nbsp;(behave differently in inference and training mode.)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;&amp;nbsp; model.eval&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;()&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #546e7a;&quot;&gt;&amp;nbsp; &lt;span style=&quot;color: #c0d1e7;&quot;&gt;# 모델에 더미 입력을 생성합니다. 필요에 따라 조정하세요. (Generate dummy inputs to the model. Adjust if necessary)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; inputs&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;{&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 'input_ids'&lt;/span&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;torch.randint&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;32,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;span style=&quot;background-color: #263238; color: #89ddff; text-align: start;&quot;&gt;[&lt;/span&gt;1, &lt;span style=&quot;color: #eeffff;&quot;&gt;3&lt;span style=&quot;color: #89ddff;&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;, dtype&lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;torch.long&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #546e7a;&quot;&gt;# 토큰화된&amp;nbsp;텍스트의&amp;nbsp;숫자&amp;nbsp;ID&amp;nbsp;목록&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;'attention_mask'&lt;/span&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;torch.ones&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;([&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;1, 32&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;, dtype&lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;torch.long&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #546e7a;&quot;&gt;# dummy list of ones&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;'token_type_ids'&lt;/span&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;torch.ones&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;([&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;1, 32&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;, dtype&lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;torch.long&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #546e7a;&quot;&gt;# dummy list of ones&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;background-color: #263238; color: #c3e88d; text-align: start;&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; symbolic_names&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;{0:&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;'&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;batch_size&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;'&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;1:&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;'&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;max_seq_len&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;'&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; torch.onnx.export(model,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #546e7a;&quot;&gt;# model being run&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; (&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;inputs[&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;'input_ids'&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;],&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;span style=&quot;background-color: #263238; color: #89ddff; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span&gt; &amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;inputs[&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;'attention_mask'&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;],&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;span style=&quot;background-color: #263238; color: #89ddff; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #263238; color: #89ddff; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;inputs[&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;'token_type_ids'&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #546e7a;&quot;&gt;# model input (or a tuple for multiple inputs)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&lt;span style=&quot;background-color: #263238; color: #89ddff; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #263238; color: #89ddff; text-align: start;&quot;&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;model_path,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #546e7a;&quot;&gt;# where to save the model (can be a file or file-like object)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;span style=&quot;background-color: #263238; color: #89ddff; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #263238; color: #89ddff; text-align: start;&quot;&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;opset_version&lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;11,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #546e7a;&quot;&gt;# the ONNX version to export the model to&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;span style=&quot;background-color: #263238; color: #89ddff; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #263238; color: #89ddff; text-align: start;&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;do_constant_folding&lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;True,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #546e7a;&quot;&gt;# whether to execute constant folding for optimization&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;span style=&quot;background-color: #263238; color: #89ddff; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #263238; color: #89ddff; text-align: start;&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;input_names&lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;'&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;input_ids&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;'&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;,&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&lt;span style=&quot;background-color: #263238; color: #89ddff; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #263238; color: #89ddff; text-align: start;&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #263238; color: #89ddff; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;'input_mask'&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&lt;span style=&quot;background-color: #263238; color: #89ddff; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #263238; color: #89ddff; text-align: start;&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #263238; color: #89ddff; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;'segment_ids'&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;],&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #546e7a;&quot;&gt;# the model's input names&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;span style=&quot;background-color: #263238; color: #89ddff; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #263238; color: #89ddff; text-align: start;&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;output_names&lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;'&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;start_logits&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;'&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;end_logits&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;], &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #546e7a;&quot;&gt;# the model's output names&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;span style=&quot;background-color: #263238; color: #89ddff; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #263238; color: #89ddff; text-align: start;&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;dynamic_axes&lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;'input_ids'&lt;/span&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;symbolic_names,&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&lt;span style=&quot;background-color: #263238; color: #89ddff; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #263238; color: #89ddff; text-align: start;&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #263238; color: #89ddff; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;'input_mask'&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;symbolic_names,&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;span style=&quot;background-color: #263238; color: #89ddff; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #263238; color: #89ddff; text-align: start;&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #263238; color: #89ddff; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;'segment_ids'&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;symbolic_names,&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&lt;span style=&quot;background-color: #263238; color: #89ddff; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #263238; color: #89ddff; text-align: start;&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #263238; color: #89ddff; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;'start_logits'&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;symbolic_names,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&lt;span style=&quot;background-color: #263238; color: #89ddff; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #263238; color: #89ddff; text-align: start;&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #263238; color: #89ddff; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;'end_logits'&lt;/span&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;symbolic_names}&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;) &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #546e7a;&quot;&gt;# variable length axes&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;ONNX Runtime을 사용하여 ONNX 모델 실행&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음&amp;nbsp;코드는&amp;nbsp;ONNX&amp;nbsp;Runtime을&amp;nbsp;사용하여&amp;nbsp;ONNX&amp;nbsp;모델을&amp;nbsp;실행합니다.&amp;nbsp;Azure&amp;nbsp;Machine&amp;nbsp;Learning에&amp;nbsp;배포하기&amp;nbsp;전에&amp;nbsp;로컬에서&amp;nbsp;테스트할&amp;nbsp;수&amp;nbsp;있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;`init()`&amp;nbsp;함수는&amp;nbsp;시작&amp;nbsp;시&amp;nbsp;호출되어&amp;nbsp;토크나이저&amp;nbsp;및&amp;nbsp;ONNX&amp;nbsp;런타임&amp;nbsp;세션&amp;nbsp;생성과&amp;nbsp;같은&amp;nbsp;일회성&amp;nbsp;작업을&amp;nbsp;수행합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;`run()`&amp;nbsp;함수는&amp;nbsp;Azure&amp;nbsp;ML&amp;nbsp;엔드포인트를&amp;nbsp;사용하여&amp;nbsp;모델을&amp;nbsp;실행할&amp;nbsp;때&amp;nbsp;호출됩니다.&amp;nbsp;필요한&amp;nbsp;`preprocess()`&amp;nbsp;및&amp;nbsp;`postprocess()`&amp;nbsp;단계를&amp;nbsp;추가하세요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로컬&amp;nbsp;테스트&amp;nbsp;및&amp;nbsp;비교를&amp;nbsp;위해&amp;nbsp;PyTorch&amp;nbsp;모델을&amp;nbsp;실행할&amp;nbsp;수도&amp;nbsp;있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #263238; color: #eeffff; text-align: start;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; import&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;os&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; import&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;logging&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; import&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;json&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; import&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;numpy&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;as&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;np&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; import&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;onnxruntime&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; import&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;transformers&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; import&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;torch&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #c0d1e7;&quot;&gt;&amp;nbsp; #&amp;nbsp;전처리&amp;nbsp;함수는&amp;nbsp;질문과&amp;nbsp;컨텍스트를&amp;nbsp;입력받아&amp;nbsp;모델에&amp;nbsp;필요한&amp;nbsp;텐서를&amp;nbsp;생성합니다.&lt;br /&gt;&amp;nbsp; # - input_ids: 질문에 포함된 단어들을 정수로 인코딩한 것&lt;br /&gt;&amp;nbsp; # - attention_mask: 이 모델에서는 사용되지 않음&lt;br /&gt;&amp;nbsp; # - token_type_ids: 질문의 단어와 컨텍스트의 단어를 구분하는 0과 1로 이루어진 리스트&lt;br /&gt;&amp;nbsp; # 이 함수는 또한 질문과 컨텍스트에 포함된 단어들을 반환하여, 답변을 구문으로 디코딩할 수 있도록 합니다.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c0d1e7;&quot;&gt;&amp;nbsp; # The pre process function take a question and a context, and generates the tensor inputs to the model:&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c0d1e7;&quot;&gt;&amp;nbsp; # - input_ids: the words in the question encoded as integers&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c0d1e7;&quot;&gt;&amp;nbsp; # - attention_mask: not used in this model&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c0d1e7;&quot;&gt;&amp;nbsp; # - token_type_ids: a list of 0s and 1s that distinguish between the words of the question and the words of the &amp;nbsp; context&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c0d1e7;&quot;&gt;&amp;nbsp; # This function also returns the words contained in the question and the context, so that the answer can be decoded into a phrase. &lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; def&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;preprocess&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;question,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;context&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;:&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;encoded_input&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;tokenizer&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;question,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;context&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;tokens&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;tokenizer.convert_ids_to_tokens&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;encoded_input.input_ids&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;return&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; (encoded_input.input_ids, &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;encoded_input.attention_mask,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;encoded_input.token_type_ids,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;tokens&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #546e7a;&quot;&gt;&amp;nbsp; &lt;span style=&quot;color: #c0d1e7;&quot;&gt;# 후처리 함수는 질문과 컨텍스트의 텍스트 토큰을 사용하여 시작 및 종료 로그 확률 목록을 텍스트 답변으로 매핑합니다.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c0d1e7;&quot;&gt;&amp;nbsp; # The post process function maps the list of start and end log probabilities onto a text answer, using the text tokens from the question&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c0d1e7;&quot;&gt;&amp;nbsp; # and context. &lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; def&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;postprocess&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;tokens,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;start,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;end&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;:&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;results&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;{}&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;answer_start&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;np.argmax&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;start&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;answer_end&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;np.argmax&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;end&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;if&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;answer_end&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;answer_start:&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;answer&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;tokens[answer_start]&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;for&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; i &lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;range&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;answer_start+1,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;answer_end+1&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;:&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;if&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;tokens[i][0:2]&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;==&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;##&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;:&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;answer&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;+=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;tokens[i][2:]&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;else:&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;answer&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;+=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;tokens[i]&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;results[&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;'answer'&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;answer.capitalize&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;()&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;else:&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/span&gt;results[&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;'error'&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;&quot;이 질문에 대한 답을 찾을 수 없습니다. 다른 질문을 해주시겠습니까?&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;I am unable to find the answer to this question. Can you please ask another question?&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;&quot;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;return&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;results&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #c0d1e7;&quot;&gt;&amp;nbsp; # 예측을 위한 일회성 초기화를 수행합니다. 초기화 코드는 엔드포인트가 설정될 때 한 번 실행됩니다.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c0d1e7;&quot;&gt;&amp;nbsp; # Perform the one-off initialization for the prediction. The init code is run once when the endpoint is setup.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; def&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;init&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;:&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;global&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;tokenizer,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;session,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;model&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;model_name&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;bert-large-uncased-whole-word-masking-finetuned-squad&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;&quot;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;model&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;transformers.BertForQuestionAnswering.from_pretrained&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;model_name&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #546e7a;&quot;&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #c0d1e7;&quot;&gt;# &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #c0d1e7;&quot;&gt;AZUREML_MODEL_DIR을 사용하여 배포된 모델을 가져옵니다. 여러 모델이 배포된 경우,&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c0d1e7;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;# use AZUREML_MODEL_DIR to get your deployed model(s). If multiple models are deployed, &lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c0d1e7;&quot;&gt;&lt;span style=&quot;background-color: #263238; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;# model_path = os.path.join(os.getenv('AZUREML_MODEL_DIR'), '$MODEL_NAME/$VERSION/$MODEL_FILE_NAME')&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;model_dir&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;os.getenv&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;'AZUREML_MODEL_DIR'&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;if&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;model_dir&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;==&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;None:&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;model_dir&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;./&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;&quot;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;model_path&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;os.path.join&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;model_dir,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;model_name&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;.onnx&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #c0d1e7;&quot;&gt; &lt;span style=&quot;background-color: #263238; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;# Create the tokenizer&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;tokenizer&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;transformers.BertTokenizer.from_pretrained&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;model_name&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c0d1e7;&quot;&gt;&lt;span style=&quot;background-color: #263238; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;# Create an ONNX Runtime session to run the ONNX model&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;session&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;onnxruntime.InferenceSession&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;model_path,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;providers=[&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;CPUExecutionProvider&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #546e7a;&quot;&gt;&amp;nbsp;&lt;span style=&quot;color: #c0d1e7;&quot;&gt; # Run the PyTorch model, for functional and performance comparison&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; def&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;run_pytorch&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;raw_data&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;:&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;inputs&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;json.loads&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;raw_data&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;model.eval&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;()&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;logging.info(&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&quot;Question:&quot;&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;inputs[&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;question&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;logging.info(&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&quot;Context: &quot;&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;inputs[&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;context&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;input_ids,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;input_mask,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;segment_ids,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;tokens&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;preprocess&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;inputs[&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&quot;question&quot;&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;],&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;inputs[&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;context&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;model_outputs&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;model&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;torch.tensor([input_ids]&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;token_type_ids=torch.tensor&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;([&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;segment_ids&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;])&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;return&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;postprocess&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;tokens,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;model_outputs.start_logits.detach&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;.numpy&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;model_outputs.end_logits.detach&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;.numpy&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;())&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #c0d1e7;&quot;&gt;&amp;nbsp; # Run the ONNX model with ONNX Runtime&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; def&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;run&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;raw_data&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;:&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;logging.info(&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&quot;Request received&quot;&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;inputs&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;json.loads&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;raw_data&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;logging.info(inputs&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c0d1e7;&quot;&gt;&lt;span style=&quot;background-color: #263238; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;# Preprocess the question and context into tokenized ids&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;input_ids,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;input_mask,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;segment_ids,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;tokens&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;preprocess&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;inputs[&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&quot;question&quot;&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;],&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;inputs[&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;context&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;logging.info(&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&quot;Running inference&quot;&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #546e7a;&quot;&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #c0d1e7;&quot;&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #c0d1e7;&quot;&gt;# Format the inputs for ONNX Runtime&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;model_inputs&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;{&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;'input_ids'&lt;/span&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; [input_ids], &lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;'input_mask'&lt;/span&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; [input_mask],&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;'segment_ids'&lt;/span&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; [segment_ids]&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;}&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;outputs&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;session.run&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;([&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;'&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;start_logits&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;'&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;'&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;end_logits&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;'&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;, model_inputs&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;logging.info(&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&quot;Post-processing&quot;&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;) &lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #546e7a;&quot;&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #c0d1e7;&quot;&gt; &amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #c0d1e7;&quot;&gt;# Post process the output of the model into an answer (or an error if the question could not be answered)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;results&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;postprocess&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;tokens,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;outputs[0],&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;outputs[1]&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;logging.info(results&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;return&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;results&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;&amp;nbsp; if&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;__name__&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;==&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;'&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;__main__&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;'&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;:&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;init&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;()&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;input&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;\&quot;&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;question&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;\&quot;&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;\&quot;&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;What is Dolly Parton's middle name?&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;\&quot;&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;\&quot;&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;context&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;\&quot;&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;\&quot;&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;Dolly Rebecca Parton is an American singer-songwriter&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;\&quot;&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;&quot;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;run_pytorch(input&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;print&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;run&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;input&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;))&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;AzureML을&amp;nbsp;통해&amp;nbsp;ONNX&amp;nbsp;런타임을&amp;nbsp;사용하여&amp;nbsp;모델&amp;nbsp;배포하기&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제&amp;nbsp;ONNX&amp;nbsp;모델과&amp;nbsp;ONNX&amp;nbsp;런타임을&amp;nbsp;사용하여&amp;nbsp;모델을&amp;nbsp;실행하는&amp;nbsp;코드가&amp;nbsp;준비되었으므로&amp;nbsp;Azure&amp;nbsp;ML을&amp;nbsp;사용하여&amp;nbsp;모델을&amp;nbsp;배포할&amp;nbsp;수&amp;nbsp;있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1434&quot; data-origin-height=&quot;858&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Gtoup/dJMcagk2yEt/XI2NauV5LsDlOMOkjteqP0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Gtoup/dJMcagk2yEt/XI2NauV5LsDlOMOkjteqP0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Gtoup/dJMcagk2yEt/XI2NauV5LsDlOMOkjteqP0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGtoup%2FdJMcagk2yEt%2FXI2NauV5LsDlOMOkjteqP0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1434&quot; height=&quot;858&quot; data-origin-width=&quot;1434&quot; data-origin-height=&quot;858&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;환경을 확인하세요 (Check your environment)&lt;/b&gt;&lt;/h4&gt;
&lt;div style=&quot;background-color: #263238; color: #eeffff; text-align: start;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; import&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;azureml.core&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; import&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;onnxruntime&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; import&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;torch&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; import&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;transformers&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;&amp;nbsp; print&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&quot;Transformers version: &quot;&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;transformers.__version__&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; torch_version&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;torch.__version__&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;&amp;nbsp; print&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&quot;Torch (ONNX exporter) version: &quot;&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;torch_version&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;&amp;nbsp; print&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&quot;Azure SDK version:&quot;&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;azureml.core.VERSION&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;&amp;nbsp; print&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&quot;ONNX Runtime version: &quot;&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;onnxruntime.__version__&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Azure&amp;nbsp;ML&amp;nbsp;작업&amp;nbsp;영역&amp;nbsp;로드&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저&amp;nbsp;구성&amp;nbsp;노트북에서&amp;nbsp;이전에&amp;nbsp;생성한&amp;nbsp;기존&amp;nbsp;작업&amp;nbsp;영역에서&amp;nbsp;작업&amp;nbsp;영역&amp;nbsp;개체를&amp;nbsp;인스턴스화합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고로,&amp;nbsp;다음&amp;nbsp;코드는&amp;nbsp;노트북과&amp;nbsp;동일한&amp;nbsp;디렉터리&amp;nbsp;또는&amp;nbsp;.azureml이라는&amp;nbsp;하위&amp;nbsp;디렉터리에&amp;nbsp;구독&amp;nbsp;정보가&amp;nbsp;포함된&amp;nbsp;config.json&amp;nbsp;파일이&amp;nbsp;있다고&amp;nbsp;가정합니다.&amp;nbsp;Workspace.get()&amp;nbsp;메서드를&amp;nbsp;사용하여&amp;nbsp;작업&amp;nbsp;영역&amp;nbsp;이름,&amp;nbsp;구독&amp;nbsp;이름&amp;nbsp;및&amp;nbsp;리소스&amp;nbsp;그룹을&amp;nbsp;명시적으로&amp;nbsp;제공할&amp;nbsp;수도&amp;nbsp;있습니다.&lt;/p&gt;
&lt;div style=&quot;background-color: #263238; color: #eeffff; text-align: start;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; import&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;os&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; from&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;azureml.core&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;Workspace&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; ws&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;Workspace.from_config&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;()&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;&amp;nbsp; print&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;ws.name,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;ws.location,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;ws.resource_group,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;ws.subscription_id,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;sep&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;'&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;\n&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;'&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; Register&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;your&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;model&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;with&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;Azure&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;ML&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; Now&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;we&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;upload&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;the&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;model&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;and&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;register&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;it&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;the&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;workspace.&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; from&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;azureml.core.model&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;Model&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; model&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;Model.register&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;model_path&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;model_path,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #546e7a;&quot;&gt;# Name of the registered model in your workspace.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; model_name&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;model_name,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #546e7a;&quot;&gt;# Local ONNX model to upload and register as a model&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;model_framework&lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;Model.Framework.ONNX&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #546e7a;&quot;&gt;# Framework used to create the model.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;model_framework_version&lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;torch_version,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #546e7a;&quot;&gt;# Version of ONNX used to create the model.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;tags&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;onnx&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;demo&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;},&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;description&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;HuggingFace BERT model fine-tuned with SQuAd and exported from PyTorch&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;,&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;span style=&quot;background-color: #263238; color: #ffcb6b; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;workspace&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;ws&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;등록된&amp;nbsp;모델&amp;nbsp;목록&amp;nbsp;보기&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 워크스페이스에 등록된 모든 모델 목록을 볼 수 있습니다.&lt;/p&gt;
&lt;div style=&quot;background-color: #263238; color: #eeffff; text-align: start;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; models&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;ws.models&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;&amp;nbsp; for&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; name, m in models.items&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;:&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;print&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&quot;Name:&quot;&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;name,&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;\tVersion:&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;m.version,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;\tDescription:&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;m.description,&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;m.tags&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #546e7a;&quot;&gt;&amp;nbsp; # &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; # If you'd like to delete the models from workspace&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #546e7a;&quot;&gt;&amp;nbsp; # &lt;span style=&quot;background-color: #263238; color: #546e7a; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;model_to_delete = Model(ws, name)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #546e7a;&quot;&gt;&amp;nbsp; # &lt;span style=&quot;background-color: #263238; color: #546e7a; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;model_to_delete.delete()&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff;&quot;&gt;
&lt;div style=&quot;background-color: #ffffff; color: #5c5962;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id=&quot;deploy-the-model-and-scoring-code-as-an-azureml-endpoint&quot; style=&quot;color: #27262b;&quot; data-ke-size=&quot;size23&quot;&gt;Deploy the model and scoring code as an AzureML endpoint&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Note: the endpoint interface of the Python SDK has not been publicly released yet, so for this section, we will use the Azure ML CLI.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;There are three YML files in the yml folder:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;env.yml: A conda environment specification, from which the execution environment of the endpoint will be generated&lt;/li&gt;
&lt;li&gt;endpoint.yml: The endpoint specification, which simply contains the name of the endpoint and the authorization method&lt;/li&gt;
&lt;li&gt;deployment.yml: The deployment specification, which contains specifications of the scoring code, model, and environment. You can create multiple deployments per endpoint, and route different amounts of traffic to the deployments. For this example, we will create only one deployment.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;The deployment can take up to 15 minutes. Note also that all of the files in the directory with the notebook will be uploaded into the docker container that forms the basis of your endpoint, including any local copies of the ONNX model (which has already been deployed to AzureML in the previous step). To reduce the deployment time remove any local copies of large files, before creating the endpoint.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;모델&amp;nbsp;및&amp;nbsp;스코어링&amp;nbsp;코드를&amp;nbsp;AzureML&amp;nbsp;엔드포인트로&amp;nbsp;배포합니다.&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;참고&lt;/b&gt;: Python SDK의 엔드포인트 인터페이스는 아직 공개되지 않았으므로 이 섹션에서는 Azure ML CLI를 사용합니다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;yml&amp;nbsp;폴더에는&amp;nbsp;다음&amp;nbsp;세&amp;nbsp;개의&amp;nbsp;YML&amp;nbsp;파일이&amp;nbsp;있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;env.yml:&amp;nbsp;conda&amp;nbsp;환경&amp;nbsp;사양으로,&amp;nbsp;엔드포인트의&amp;nbsp;실행&amp;nbsp;환경을&amp;nbsp;생성하는&amp;nbsp;데&amp;nbsp;사용됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;endpoint.yml:&amp;nbsp;엔드포인트&amp;nbsp;사양으로,&amp;nbsp;엔드포인트&amp;nbsp;이름과&amp;nbsp;인증&amp;nbsp;방법을&amp;nbsp;포함합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;deployment.yml:&amp;nbsp;배포&amp;nbsp;사양으로,&amp;nbsp;스코어링&amp;nbsp;코드,&amp;nbsp;모델&amp;nbsp;및&amp;nbsp;환경에&amp;nbsp;대한&amp;nbsp;사양을&amp;nbsp;포함합니다.&amp;nbsp;엔드포인트당&amp;nbsp;여러&amp;nbsp;개의&amp;nbsp;배포를&amp;nbsp;생성하고&amp;nbsp;각&amp;nbsp;배포로&amp;nbsp;전송되는&amp;nbsp;트래픽&amp;nbsp;양을&amp;nbsp;다르게&amp;nbsp;지정할&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;이&amp;nbsp;예에서는&amp;nbsp;하나의&amp;nbsp;배포만&amp;nbsp;생성합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배포에는&amp;nbsp;최대&amp;nbsp;15분이&amp;nbsp;소요될&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;또한&amp;nbsp;노트북이&amp;nbsp;있는&amp;nbsp;디렉터리의&amp;nbsp;모든&amp;nbsp;파일(이전&amp;nbsp;단계에서&amp;nbsp;AzureML에&amp;nbsp;이미&amp;nbsp;배포된&amp;nbsp;ONNX&amp;nbsp;모델의&amp;nbsp;로컬&amp;nbsp;복사본&amp;nbsp;포함)이&amp;nbsp;엔드포인트의&amp;nbsp;기반이&amp;nbsp;되는&amp;nbsp;Docker&amp;nbsp;컨테이너에&amp;nbsp;업로드됩니다.&amp;nbsp;배포&amp;nbsp;시간을&amp;nbsp;단축하려면&amp;nbsp;엔드포인트를&amp;nbsp;생성하기&amp;nbsp;전에&amp;nbsp;대용량&amp;nbsp;파일의&amp;nbsp;로컬&amp;nbsp;복사본을&amp;nbsp;모두&amp;nbsp;제거하십시오.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;노트북&amp;nbsp;파일은&amp;nbsp;ONNX&amp;nbsp;모델의&amp;nbsp;로컬&amp;nbsp;복사본(이전&amp;nbsp;단계에서&amp;nbsp;AzureML에&amp;nbsp;이미&amp;nbsp;배포됨)을&amp;nbsp;포함하여&amp;nbsp;엔드포인트의&amp;nbsp;기반이&amp;nbsp;되는&amp;nbsp;Docker&amp;nbsp;컨테이너에&amp;nbsp;업로드됩니다.&amp;nbsp;배포&amp;nbsp;시간을&amp;nbsp;단축하려면&amp;nbsp;엔드포인트를&amp;nbsp;생성하기&amp;nbsp;전에&amp;nbsp;대용량&amp;nbsp;파일의&amp;nbsp;로컬&amp;nbsp;복사본을&amp;nbsp;모두&amp;nbsp;제거하십시오.&lt;/p&gt;
&lt;div style=&quot;background-color: #263238; color: #eeffff; text-align: start;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; az&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;ml&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;online-endpoint&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;create&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;--name&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;question-answer-ort&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;--file&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;yml/endpoint.yml&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;--subscription&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;{ws.subscription_id}&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;--resource-group&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;{ws.resource_group}&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;--workspace-name&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;{ws.name}&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; az&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;ml&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;online-deployment&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;create&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;--endpoint-name&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;question-answer-ort&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;--name&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;blue&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;--file&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;yml/deployment.yml&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;--all-traffic&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;--subscription&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;{ws.subscription_id}&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;--resource-group&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;{ws.resource_group}&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;--workspace-name&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;{ws.name}&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;배포된 엔드포인트 테스트&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 명령은 배포된 질문-답변 모델을 실행합니다. test-data.json 파일에 테스트 질문이 있습니다. 이 파일을 직접 질문과 컨텍스트로 편집할 수 있습니다.&lt;/p&gt;
&lt;div style=&quot;background-color: #263238; color: #eeffff; text-align: start;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; az&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;ml&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;online-endpoint&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;invoke&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;--name&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;question-answer-ort&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;--request-file&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;test-data.json&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;--subscription&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;{ws.subscription_id}&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;--resource-group&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;{ws.resource_group}&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;--workspace-name&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;{ws.name}&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기까지&amp;nbsp;진행했다면&amp;nbsp;ONNX&amp;nbsp;모델을&amp;nbsp;사용하여&amp;nbsp;질문에&amp;nbsp;답변하는&amp;nbsp;엔드포인트를&amp;nbsp;배포한&amp;nbsp;것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;질문과&amp;nbsp;컨텍스트를&amp;nbsp;직접&amp;nbsp;제공하여&amp;nbsp;질문에&amp;nbsp;답변할&amp;nbsp;수&amp;nbsp;있습니다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Azure&amp;nbsp;리소스&amp;nbsp;정리&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음&amp;nbsp;명령은&amp;nbsp;배포한&amp;nbsp;AzureML&amp;nbsp;엔드포인트를&amp;nbsp;삭제합니다.&amp;nbsp;AzureML&amp;nbsp;작업&amp;nbsp;영역,&amp;nbsp;컴퓨팅&amp;nbsp;리소스&amp;nbsp;및&amp;nbsp;등록된&amp;nbsp;모델도&amp;nbsp;정리할&amp;nbsp;수&amp;nbsp;있습니다.&lt;/p&gt;
&lt;div style=&quot;background-color: #263238; color: #eeffff; text-align: start;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; az&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;ml&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;online-endpoint&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;delete&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;--name&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;question-answer-ort&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;--yes&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;--subscription&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;{ws.subscription_id}&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;--resource-group&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;{ws.resource_group}&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;--workspace-name&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;{ws.name}&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Project ES/: : ONNX</category>
      <author>Jay.P Morgan</author>
      <guid isPermaLink="true">https://eartist.tistory.com/1277</guid>
      <comments>https://eartist.tistory.com/1277#entry1277comment</comments>
      <pubDate>Fri, 1 May 2026 00:11:25 +0900</pubDate>
    </item>
    <item>
      <title>ONNX Runtime 설치</title>
      <link>https://eartist.tistory.com/1276</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1 id=&quot;install-onnx-runtime&quot; style=&quot;color: #27262b; text-align: start;&quot;&gt;ONNX Runtime 설치&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;원하는&amp;nbsp;운영&amp;nbsp;체제,&amp;nbsp;하드웨어,&amp;nbsp;가속기&amp;nbsp;및&amp;nbsp;언어&amp;nbsp;조합에&amp;nbsp;대한&amp;nbsp;권장&amp;nbsp;설치&amp;nbsp;지침은&amp;nbsp;설치&amp;nbsp;매트릭스를&amp;nbsp;참조하십시오.&lt;br /&gt;&lt;br /&gt;운영&amp;nbsp;체제&amp;nbsp;버전,&amp;nbsp;컴파일러,&amp;nbsp;언어&amp;nbsp;버전,&amp;nbsp;종속&amp;nbsp;라이브러리&amp;nbsp;등에&amp;nbsp;대한&amp;nbsp;자세한&amp;nbsp;내용은&amp;nbsp;호환성&amp;nbsp;항목을&amp;nbsp;참조하십시오.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;border-left: #0B2161 10px solid; padding-right: 10px; border-bottom: #0B2161 2px solid; pading-bottom: px; padding-top: 0px; margin: 10px 0px 5px; line-height: 30px;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;b&gt;1. &amp;nbsp;ONNX 설치&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; 1.1 &amp;nbsp;요구사항&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든 빌드에는 en_US.UTF-8 로케일이 포함된 영어 언어 패키지가 필요합니다. Linux에서는 locale-gen en_US.UTF-8 및 update-locale LANG=en_US.UTF-8 명령을 실행하여 &amp;nbsp;&lt;a style=&quot;color: #226aca;&quot; href=&quot;https://packages.ubuntu.com/search?keywords=language-pack-en&quot;&gt;language-pack-en package&lt;/a&gt;&amp;nbsp;를 설치하십시오.&lt;br /&gt;Windows&amp;nbsp;빌드에는 &amp;nbsp;&lt;a style=&quot;color: #226aca;&quot; href=&quot;https://learn.microsoft.com/en-us/cpp/windows/latest-supported-vc-redist?view=msvc-170#latest-microsoft-visual-c-redistributable-version&quot;&gt;Visual C++ 2019 runtime&lt;/a&gt;이&amp;nbsp;필요합니다.&amp;nbsp;최신&amp;nbsp;버전을&amp;nbsp;사용하는&amp;nbsp;것이&amp;nbsp;좋습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; 1.2 &amp;nbsp;CUDA와 CuDnn&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ONNX Runtime GPU 패키지를 사용하려면 &lt;a style=&quot;color: #226aca;&quot; href=&quot;https://developer.nvidia.com/cuda-toolkit&quot;&gt;CUDA&lt;/a&gt;와 &lt;a style=&quot;color: #226aca;&quot; href=&quot;https://developer.nvidia.com/cudnn&quot;&gt;cuDNN&lt;/a&gt;을 설치해야 합니다. 호환되는 CUDA 및 cuDNN 버전을 확인하려면 &lt;a style=&quot;color: #226aca;&quot; href=&quot;https://onnxruntime.ai/docs/execution-providers/CUDA-ExecutionProvider.html#requirements&quot;&gt;CUDA execution provider requirements&lt;/a&gt;을 참조하십시오.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;zlib는&amp;nbsp;Linux용&amp;nbsp;cuDNN&amp;nbsp;9.x에서만&amp;nbsp;필요합니다(zlib는&amp;nbsp;cuDNN&amp;nbsp;9.x&amp;nbsp;Windows&amp;nbsp;동적&amp;nbsp;라이브러리에&amp;nbsp;정적으로&amp;nbsp;링크됨).&amp;nbsp;또는&amp;nbsp;Linux&amp;nbsp;및&amp;nbsp;Windows용&amp;nbsp;cuDNN&amp;nbsp;8.x에서도&amp;nbsp;필요합니다.&amp;nbsp;Linux&amp;nbsp;또는&amp;nbsp;Windows에&amp;nbsp;zlib를&amp;nbsp;설치하려면 &lt;a style=&quot;color: #226aca;&quot; href=&quot;https://docs.nvidia.com/deeplearning/cudnn/archives/cudnn-890/install-guide/index.html&quot;&gt;cuDNN 8.9 installation guide&lt;/a&gt;를&amp;nbsp;참조하십시오.&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;Windows에서는&amp;nbsp;CUDA&amp;nbsp;bin&amp;nbsp;및&amp;nbsp;cuDNN&amp;nbsp;bin&amp;nbsp;디렉터리의&amp;nbsp;경로를&amp;nbsp;PATH&amp;nbsp;환경&amp;nbsp;변수에&amp;nbsp;추가해야&amp;nbsp;합니다.&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;Linux에서는&amp;nbsp;CUDA&amp;nbsp;lib64&amp;nbsp;및&amp;nbsp;cuDNN&amp;nbsp;lib&amp;nbsp;디렉터리의&amp;nbsp;경로를&amp;nbsp;LD_LIBRARY_PATH&amp;nbsp;환경&amp;nbsp;변수에&amp;nbsp;추가해야&amp;nbsp;합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;onnxruntime-gpu 패키지를 사용하면 CUDA 또는 cuDNN을 수동으로 설치하지 않고도 PyTorch와 함께 사용할 수 있습니다. 자세한 내용은 &lt;a style=&quot;color: #226aca;&quot; href=&quot;https://onnxruntime.ai/docs/execution-providers/CUDA-ExecutionProvider.html#compatibility-with-pytorch&quot;&gt;Compatibility with PyTorch&lt;/a&gt;을 참조하십시오.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;border-left: #0B2161 10px solid; padding-right: 10px; border-bottom: #0B2161 2px solid; pading-bottom: px; padding-top: 0px; margin: 10px 0px 5px; line-height: 30px;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;b&gt;2. &amp;nbsp;Python 설치&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; 2.1&amp;nbsp; ONNX Runtime CPU 설치&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #263238; color: #eeffff; text-align: start;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;pip&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;install&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;onnxruntime&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff;&quot;&gt;
&lt;div style=&quot;background-color: #ffffff; color: #5c5962;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p id=&quot;install-nightly&quot; style=&quot;color: #27262b;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;INSTALL NIGHTLY&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #263238; color: #eeffff; text-align: start;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; pip&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;install&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;coloredlogs&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;flatbuffers&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;numpy&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;packaging&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;protobuf&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;sympy&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; pip&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;install&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;--pre&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;--index-url&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;https://aiinfra.pkgs.visualstudio.com/PublicPackages/_packaging/ORT-Nightly/pypi/simple&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;onnxruntime&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;p style=&quot;color: #27262b;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #27262b;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; 2.2 &amp;nbsp;ONNX 런타임 GPU(DirectML) 설치 - 지속형 엔지니어링 모드&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;install-onnx-runtime-gpu-directml---sustained-engineering-mode&quot; style=&quot;color: #27262b;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Note&lt;/b&gt;: DirectML은&amp;nbsp;지속적인&amp;nbsp;엔지니어링&amp;nbsp;작업이&amp;nbsp;진행&amp;nbsp;중입니다.&amp;nbsp;새로운&amp;nbsp;Windows&amp;nbsp;프로젝트에서는 &lt;a style=&quot;color: #226aca;&quot; href=&quot;https://onnxruntime.ai/docs/install/#winml-recommended-for-windows&quot;&gt;WinML&lt;/a&gt;을 사용하는 것을 고려해 보세요.&lt;/p&gt;
&lt;div style=&quot;background-color: #263238; color: #eeffff; text-align: start;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;pip&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;install&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;onnxruntime-directml&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;install-nightly-1&quot; style=&quot;color: #27262b;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;INSTALL NIGHTLY&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #263238; color: #eeffff; text-align: start;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; pip&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;install&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;coloredlogs&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;flatbuffers&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;numpy&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;packaging&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;protobuf&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;sympy&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; pip&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;install&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;--pre&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;--index-url&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;https://aiinfra.pkgs.visualstudio.com/PublicPackages/_packaging/ORT-Nightly/pypi/simple&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;onnxruntime-directml&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff;&quot;&gt;
&lt;div style=&quot;background-color: #ffffff; color: #5c5962;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; 2.3 &amp;nbsp;ONNX 런타임 GPU(CUDA 또는 TensorRT)를 설치하세요.&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;install-onnx-runtime-gpu-cuda-or-tensorrt&quot; style=&quot;color: #27262b;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;cuda-12x&quot; style=&quot;color: #27262b;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&amp;nbsp; CUDA 12.X&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;a style=&quot;color: #226aca;&quot; href=&quot;https://pypi.org/project/onnxruntime-gpu&quot;&gt;onnxruntime-gpu in pypi&lt;/a&gt;의 기본 CUDA 버전은 1.19.0 버전부터 12.x입니다.&lt;/p&gt;
&lt;div style=&quot;background-color: #263238; color: #eeffff; text-align: start;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;pip&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;install&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;onnxruntime-gpu&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;For previous versions, you can download here:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;color: #226aca;&quot; href=&quot;https://aiinfra.visualstudio.com/PublicPackages/_artifacts/feed/onnxruntime-cuda-12/PyPI/onnxruntime-gpu/overview/1.18.1&quot;&gt;1.18.1&lt;/a&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;color: #226aca;&quot; href=&quot;https://aiinfra.visualstudio.com/PublicPackages/_artifacts/feed/onnxruntime-cuda-12/PyPI/onnxruntime-gpu/overview/1.18.0&quot;&gt;1.18.0&lt;/a&gt;&lt;/p&gt;
&lt;h4 style=&quot;color: #27262b;&quot; data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;p id=&quot;nightly-for-cuda-13x&quot; style=&quot;color: #27262b;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;NIGHTLY FOR CUDA 13.X&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #263238; color: #eeffff; text-align: start;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; pip&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;install&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;coloredlogs&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;flatbuffers&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;numpy&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;packaging&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;protobuf&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;sympy&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; pip&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;install&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;--pre&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;--index-url&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;https://aiinfra.pkgs.visualstudio.com/PublicPackages/_packaging/ort-cuda-13/nightly/pypi/simple/&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;onnxruntime-gpu&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;nightly-for-cuda-12x&quot; style=&quot;color: #27262b;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;NIGHTLY FOR CUDA 12.X&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #263238; color: #eeffff; text-align: start;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; pip&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;install&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;coloredlogs&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;flatbuffers&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;numpy&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;packaging&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;protobuf&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;sympy&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; pip&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;install&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;--pre&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;--index-url&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;https://aiinfra.pkgs.visualstudio.com/PublicPackages/_packaging/ORT-Nightly/pypi/simple/&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;onnxruntime-gpu&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff;&quot;&gt;
&lt;div style=&quot;background-color: #ffffff; color: #5c5962;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;cuda-11x&quot; style=&quot;color: #27262b;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;CUDA 11.X&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;CUDA 11.x의 경우, &lt;a style=&quot;color: #226aca;&quot; href=&quot;https://aiinfra.visualstudio.com/PublicPackages/_artifacts/feed/onnxruntime-cuda-11/PyPI/onnxruntime-gpu/overview&quot;&gt;ORT Azure Devops Feed&lt;/a&gt;에서 1.19.2 이상 버전을 설치하려면 다음 지침을 따르십시오.&lt;/span&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #263238; color: #eeffff; text-align: start;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; pip&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;install&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;coloredlogs&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;flatbuffers&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;numpy&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;packaging&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;protobuf&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;sympy&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; pip&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;install&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;onnxruntime-gpu&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;--index-url&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;https://aiinfra.pkgs.visualstudio.com/PublicPackages/_packaging/onnxruntime-cuda-11/pypi/simple/&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff;&quot;&gt;
&lt;div style=&quot;background-color: #ffffff; color: #5c5962;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;For previous versions, you can download here:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;color: #226aca;&quot; href=&quot;https://pypi.org/project/onnxruntime-gpu/1.18.1/&quot;&gt;1.18.1&lt;/a&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;color: #226aca;&quot; href=&quot;https://pypi.org/project/onnxruntime-gpu/1.18.0/&quot;&gt;1.18.0&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; 2.4 &amp;nbsp;ONNX 런타임 QNN 설치&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #263238; color: #eeffff; text-align: start;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;pip&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;install&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;onnxruntime-qnn&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff;&quot;&gt;
&lt;div style=&quot;background-color: #ffffff; color: #5c5962;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p id=&quot;install-nightly-2&quot; style=&quot;color: #27262b;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;INSTALL NIGHTLY&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #263238; color: #eeffff; text-align: start;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; pip&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;install&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;coloredlogs&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;flatbuffers&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;numpy&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;packaging&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;protobuf&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;sympy&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; pip&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;install&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;--pre&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;--index-url&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;https://aiinfra.pkgs.visualstudio.com/PublicPackages/_packaging/ORT-Nightly/pypi/simple/&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;onnxruntime-qnn&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff;&quot;&gt;
&lt;div style=&quot;background-color: #ffffff; color: #5c5962;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;border-left: #0B2161 10px solid; padding-right: 10px; border-bottom: #0B2161 2px solid; pading-bottom: px; padding-top: 0px; margin: 10px 0px 5px; line-height: 30px;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;b&gt;3. &amp;nbsp;&lt;span style=&quot;color: #27262b; text-align: start;&quot;&gt;C#/C/C++/WinML Installs&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; 3.1 &amp;nbsp;&lt;span style=&quot;color: #27262b; text-align: start;&quot;&gt;Install ONNX Runtime&lt;/span&gt;&lt;span style=&quot;color: #27262b; text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;cccwinml-installs&quot; style=&quot;color: #27262b;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;install-onnx-runtime-cpu-1&quot; style=&quot;color: #27262b;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;INSTALL ONNX RUNTIME CPU&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #263238; color: #eeffff; text-align: start;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c0d1e7;&quot;&gt;&amp;nbsp; # CPU&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; dotnet&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;add&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;package&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;Microsoft.ML.OnnxRuntime&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff;&quot;&gt;
&lt;div style=&quot;background-color: #ffffff; color: #5c5962;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p id=&quot;install-onnx-runtime-gpu-cuda-12x&quot; style=&quot;color: #27262b;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;INSTALL ONNX RUNTIME GPU (CUDA 12.X)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ORT의&amp;nbsp;기본&amp;nbsp;CUDA&amp;nbsp;버전은&amp;nbsp;12.x입니다.&lt;/p&gt;
&lt;div style=&quot;background-color: #263238; color: #eeffff; text-align: start;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&lt;span style=&quot;color: #546e7a;&quot;&gt;&amp;nbsp; &lt;span style=&quot;color: #c0d1e7;&quot;&gt;# GPU&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; dotnet&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;add&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;package&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;Microsoft.ML.OnnxRuntime.Gpu&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff;&quot;&gt;
&lt;div style=&quot;background-color: #ffffff; color: #5c5962;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p id=&quot;install-onnx-runtime-gpu-cuda-118&quot; style=&quot;color: #27262b;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;INSTALL ONNX RUNTIME GPU (CUDA 11.8)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp; (1) Project Setup&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Azure Artifacts 키링의 최신 버전을 &lt;a style=&quot;color: #226aca;&quot; href=&quot;https://github.com/microsoft/artifacts-credprovider#azure-artifacts-credential-provider&quot;&gt;Github Repo&lt;/a&gt;에서 설치했는지 확인하세요.&lt;br /&gt;프로젝트의&amp;nbsp;.csproj&amp;nbsp;파일과&amp;nbsp;동일한&amp;nbsp;디렉터리에&amp;nbsp;nuget.config&amp;nbsp;파일을&amp;nbsp;추가하세요.&lt;/p&gt;
&lt;div style=&quot;background-color: #263238; color: #eeffff; text-align: start;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;&amp;nbsp; &amp;lt;?&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;xml version&lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;1.0&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; encoding&lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;utf-8&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;?&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;configuration&lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;packageSources&lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;clear&lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;add key&lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;onnxruntime-cuda-11&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;&quot;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&amp;nbsp; value&lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;https://aiinfra.pkgs.visualstudio.com/PublicPackages/_packaging/onnxruntime-cuda-11/nuget/v3/index.json&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;&amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;packageSources&lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;&amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;configuration&lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp; (2) Restore packages&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;패키지&amp;nbsp;복원(대화형&amp;nbsp;플래그를&amp;nbsp;사용하면&amp;nbsp;dotnet이&amp;nbsp;자격&amp;nbsp;증명을&amp;nbsp;입력하라는&amp;nbsp;메시지를&amp;nbsp;표시합니다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #263238; color: #eeffff; text-align: start;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;dotnet&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;add&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;package&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;Microsoft.ML.OnnxRuntime.Gpu&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;참고&lt;/b&gt;:&amp;nbsp;매번&amp;nbsp;-interactive&amp;nbsp;옵션을&amp;nbsp;추가할&amp;nbsp;필요는&amp;nbsp;없습니다.&amp;nbsp;dotnet은&amp;nbsp;자격&amp;nbsp;증명&amp;nbsp;업데이트가&amp;nbsp;필요한&amp;nbsp;경우&amp;nbsp;-interactive&amp;nbsp;옵션을&amp;nbsp;추가하라는&amp;nbsp;메시지를&amp;nbsp;표시합니다.&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff;&quot;&gt;
&lt;div style=&quot;background-color: #ffffff; color: #5c5962;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;directml-sustained-engineering---use-winml-for-new-projects&quot; style=&quot;color: #27262b;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;DIRECTML (SUSTAINED ENGINEERING - USE WINML FOR NEW PROJECTS)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #263238; color: #eeffff; text-align: start;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;dotnet&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;add&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;package&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;Microsoft.ML.OnnxRuntime.DirectML&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;color: #27262b;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;참고&lt;/b&gt;:&amp;nbsp;DirectML은&amp;nbsp;지속적인&amp;nbsp;개발&amp;nbsp;단계에&amp;nbsp;있습니다.&amp;nbsp;새로운&amp;nbsp;Windows&amp;nbsp;프로젝트에서는&amp;nbsp;WinML을&amp;nbsp;대신&amp;nbsp;사용하십시오.&lt;/span&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff;&quot;&gt;
&lt;div style=&quot;background-color: #ffffff; color: #5c5962;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p id=&quot;winml-recommended-for-windows&quot; style=&quot;color: #27262b;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;WINML (RECOMMENDED FOR WINDOWS)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #263238; color: #eeffff; text-align: start;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; dotnet&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;add&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;package&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;Microsoft.AI.MachineLearning&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff;&quot;&gt;
&lt;div style=&quot;background-color: #ffffff; color: #5c5962;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;border-left: #0B2161 10px solid; padding-right: 10px; border-bottom: #0B2161 2px solid; pading-bottom: px; padding-top: 0px; margin: 10px 0px 5px; line-height: 30px;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;b&gt;4. web과 mobile에 설치&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;pre-built 패키지는 모든 ONNX 연산 집합 및 연산자를 완벽하게 지원합니다.&lt;br /&gt;pre-built 패키지의 크기가 너무 큰 경우 &lt;a style=&quot;color: #226aca;&quot; href=&quot;https://onnxruntime.ai/docs/build/custom.html&quot;&gt;custom build&lt;/a&gt;(사용자 지정 빌드)를 생성할 수 있습니다. 사용자 지정 빌드는 모델에 필요한 연산 집합과 연산자만 포함하여 크기를 줄일 수 있습니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; 4.1&amp;nbsp; JavaScript 설치&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;install-onnx-runtime-web-browsers&quot; style=&quot;color: #27262b;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&amp;nbsp; INSTALL ONNX RUNTIME WEB (BROWSERS)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #263238; color: #eeffff; text-align: start;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c0d1e7;&quot;&gt;&amp;nbsp; # install latest release version&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; npm&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;install&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;onnxruntime-web&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #c0d1e7;&quot;&gt;&amp;nbsp; # install nightly build dev version&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; npm&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;install&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;onnxruntime-web@dev&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff;&quot;&gt;
&lt;div style=&quot;background-color: #ffffff; color: #5c5962;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p id=&quot;install-onnx-runtime-nodejs-binding-nodejs&quot; style=&quot;color: #27262b;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;INSTALL ONNX RUNTIME NODE.JS BINDING (NODE.JS)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #263238; color: #eeffff; text-align: start;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c0d1e7;&quot;&gt;&amp;nbsp; # install latest release version&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; npm&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;install&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;onnxruntime-node&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff;&quot;&gt;
&lt;div style=&quot;background-color: #ffffff; color: #5c5962;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p id=&quot;install-onnx-runtime-for-react-native&quot; style=&quot;color: #27262b;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;INSTALL ONNX RUNTIME FOR REACT NATIVE&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #263238; color: #eeffff; text-align: start;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #c0d1e7;&quot;&gt;&amp;nbsp; # install latest release version&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; npm&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;install&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;onnxruntime-react-native&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff;&quot;&gt;
&lt;div style=&quot;background-color: #ffffff; color: #5c5962;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; 4.2 &amp;nbsp;iOS에 설치&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CocoaPods&amp;nbsp;Podfile에&amp;nbsp;사용하려는&amp;nbsp;API에&amp;nbsp;따라&amp;nbsp;onnxruntime-c&amp;nbsp;또는&amp;nbsp;onnxruntime-objc&amp;nbsp;pod를&amp;nbsp;추가하세요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;cc&quot; style=&quot;color: #27262b;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;C/C++&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #263238; color: #eeffff; text-align: start;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; use_frameworks!&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; pod&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;'&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;onnxruntime-c&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;'&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff;&quot;&gt;
&lt;div style=&quot;background-color: #ffffff; color: #5c5962;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p id=&quot;objective-c&quot; style=&quot;color: #27262b;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;OBJECTIVE-C&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #263238; color: #eeffff; text-align: start;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; use_frameworks!&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; pod&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;'&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;onnxruntime-objc&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;'&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;pod&amp;nbsp;install을&amp;nbsp;실행하세요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;p id=&quot;custom-build&quot; style=&quot;color: #27262b;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;CUSTOM BUILD&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a style=&quot;color: #226aca;&quot; href=&quot;https://onnxruntime.ai/docs/build/custom.html#ios&quot;&gt;custom iOS package&lt;/a&gt; 생성 방법에 대한 지침을 참조하십시오.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; 4.3 &amp;nbsp;Android에 설치&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;javakotlin&quot; style=&quot;color: #27262b;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;JAVA/KOTLIN&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Android&amp;nbsp;Studio&amp;nbsp;프로젝트에서&amp;nbsp;다음과&amp;nbsp;같이&amp;nbsp;변경하세요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp; (1) build.gradle (Project):&lt;/b&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #263238; color: #eeffff; text-align: start;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; repositories&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;{&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; mavenCentral&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;()&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&amp;nbsp; &lt;span style=&quot;background-color: #263238; color: #c3e88d; text-align: start;&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp; (2) build.gradle (Module):&lt;/b&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #263238; color: #eeffff; text-align: start;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; dependencies&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;{&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; implementation&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;'&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;com.microsoft.onnxruntime:onnxruntime-android:latest.release&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;'&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&amp;nbsp; &lt;span style=&quot;background-color: #263238; color: #c3e88d; text-align: start;&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li style=&quot;background-color: #ffffff;&quot;&gt;
&lt;div style=&quot;background-color: #ffffff; color: #5c5962;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p id=&quot;cc-1&quot; style=&quot;color: #27262b;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;C/C++&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MavenCentral에서 호스팅되는 &lt;a style=&quot;color: #226aca;&quot; href=&quot;https://mvnrepository.com/artifact/com.microsoft.onnxruntime/onnxruntime-android&quot;&gt;onnxruntime-android&lt;/a&gt;&amp;nbsp;AAR 파일을 다운로드하고, 파일 확장자를 .aar에서 .zip으로 변경한 후 압축을 해제하세요. 헤더 폴더의 헤더 파일과 jni 폴더의 관련 libonnxruntime.so 동적 라이브러리를 NDK 프로젝트에 포함시키세요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;custom-build-1&quot; style=&quot;color: #27262b;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;CUSTOM BUILD&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a style=&quot;color: #226aca;&quot; href=&quot;https://onnxruntime.ai/docs/build/custom.html#android&quot;&gt;custom Android package&lt;/a&gt;&amp;nbsp;생성 방법에 대한 지침을 참조하십시오.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;border-left: #0B2161 10px solid; padding-right: 10px; border-bottom: #0B2161 2px solid; pading-bottom: px; padding-top: 0px; margin: 10px 0px 5px; line-height: 30px;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;b&gt;5. On-Device Training용 설치&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;달리&amp;nbsp;명시되지&amp;nbsp;않는&amp;nbsp;한,&amp;nbsp;이&amp;nbsp;섹션의&amp;nbsp;설치&amp;nbsp;지침은&amp;nbsp;기기&amp;nbsp;내&amp;nbsp;학습을&amp;nbsp;수행하도록&amp;nbsp;설계된&amp;nbsp;사전&amp;nbsp;구축&amp;nbsp;패키지를&amp;nbsp;참조합니다.&lt;br /&gt;사전&amp;nbsp;구축된&amp;nbsp;학습&amp;nbsp;패키지가&amp;nbsp;모델을&amp;nbsp;지원하지만&amp;nbsp;크기가&amp;nbsp;너무&amp;nbsp;큰&amp;nbsp;경우 &lt;a style=&quot;color: #226aca;&quot; href=&quot;https://onnxruntime.ai/docs/build/custom.html&quot;&gt;custom training build&lt;/a&gt;를&amp;nbsp;생성할&amp;nbsp;수&amp;nbsp;있습니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; 5.1&amp;nbsp; Offline 단계 - Training용 준비&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;offline-phase---prepare-for-training&quot; style=&quot;color: #27262b;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Offline Phase - Prepare for Training&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #263238; color: #eeffff; text-align: start;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; python&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;-m&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;pip&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;install&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;cerberus&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;flatbuffers&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;h5py&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;nump&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;y&lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;1.16.6&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;onnx&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;packaging&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;protobuf&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;sympy&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;setuptool&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;s&lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #f78c6c;&quot;&gt;41.4.0&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; pip&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;install&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;-i&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;https://aiinfra.pkgs.visualstudio.com/PublicPackages/_packaging/ORT/pypi/simple/&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;onnxruntime-training-cpu&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff;&quot;&gt;
&lt;div style=&quot;background-color: #ffffff; color: #5c5962;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; 5.2 &amp;nbsp;Training 단계 - On-Device 학습&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;table style=&quot;letter-spacing: 0px; border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style13&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #ffffff;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Device&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Language&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;PackageName&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Installation Instructions&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #ffffff;&quot;&gt;Windows&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot;&gt;C, C++, C#&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot;&gt;&lt;a style=&quot;color: #226aca;&quot; href=&quot;https://www.nuget.org/packages/Microsoft.ML.OnnxRuntime&quot;&gt;Microsoft.ML.OnnxRuntime.Training&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot;&gt;dotnet add package Microsoft.ML.OnnxRuntime.Training&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #ffffff;&quot;&gt;Linux&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot;&gt;C, C++&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot;&gt;&lt;a style=&quot;color: #226aca;&quot; href=&quot;https://github.com/microsoft/onnxruntime/releases&quot;&gt;onnxruntime-training-linux*.tgz&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot;&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Download the&amp;nbsp;*.tgz&amp;nbsp;file from&amp;nbsp;&lt;a style=&quot;color: #226aca;&quot; href=&quot;https://github.com/microsoft/onnxruntime/releases&quot;&gt;here&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Extract it.&lt;/li&gt;
&lt;li&gt;Move and include the header files in the&amp;nbsp;include&amp;nbsp;directory.&lt;/li&gt;
&lt;li&gt;Move the&amp;nbsp;libonnxruntime.so&amp;nbsp;dynamic library to a desired path and include it.&lt;/li&gt;
&lt;/ul&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #ffffff;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot;&gt;Python&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot;&gt;&lt;a style=&quot;color: #226aca;&quot; href=&quot;https://pypi.org/project/onnxruntime-training/&quot;&gt;onnxruntime-training&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot;&gt;pip install onnxruntime-training&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #ffffff;&quot;&gt;Android&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot;&gt;C, C++&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot;&gt;&lt;a style=&quot;color: #226aca;&quot; href=&quot;https://mvnrepository.com/artifact/com.microsoft.onnxruntime/onnxruntime-training-android&quot;&gt;onnxruntime-training-android&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot;&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Download the&amp;nbsp;&lt;a style=&quot;color: #226aca;&quot; href=&quot;https://mvnrepository.com/artifact/com.microsoft.onnxruntime/onnxruntime-android&quot;&gt;onnxruntime-training-android (full package)&lt;/a&gt;&amp;nbsp;AAR hosted at Maven Central.&lt;/li&gt;
&lt;li&gt;Change the file extension from&amp;nbsp;.aar&amp;nbsp;to&amp;nbsp;.zip, and unzip it.&lt;/li&gt;
&lt;li&gt;Include the header files from the&amp;nbsp;headers&amp;nbsp;folder.&lt;/li&gt;
&lt;li&gt;Include the relevant&amp;nbsp;libonnxruntime.sodynamic library from the&amp;nbsp;jni&amp;nbsp;folder in your NDK project.&lt;/li&gt;
&lt;/ul&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #ffffff;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot;&gt;Java/Kotlin&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot;&gt;&lt;a style=&quot;color: #226aca;&quot; href=&quot;https://mvnrepository.com/artifact/com.microsoft.onnxruntime/onnxruntime-android&quot;&gt;onnxruntime-training-android&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot;&gt;In your Android Studio Project, make the following changes to:&amp;nbsp;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;build.gradle (Project):&amp;nbsp;repositories { mavenCentral() }&amp;nbsp;&lt;/li&gt;
&lt;li&gt;build.gradle (Module):&amp;nbsp;dependencies { implementation 'com.microsoft.onnxruntime:onnxruntime-training-android:latest.release' }&amp;nbsp;&lt;/li&gt;
&lt;/ol&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #ffffff;&quot;&gt;iOS&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot;&gt;C, C++&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot;&gt;&lt;b&gt;CocoaPods: onnxruntime-training-c&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot;&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;In your CocoaPods&amp;nbsp;Podfile, add the&amp;nbsp;onnxruntime-training-c&amp;nbsp;pod:&lt;/li&gt;
&lt;li&gt;Run&amp;nbsp;pod install.&lt;/li&gt;
&lt;/ul&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #ffffff;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot;&gt;Objective-C&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot;&gt;&lt;b&gt;CocoaPods: onnxruntime-training-objc&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot;&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;In your CocoaPods&amp;nbsp;Podfile, add the&amp;nbsp;onnxruntime-training-objc&amp;nbsp;pod:&lt;/li&gt;
&lt;li&gt;Run&amp;nbsp;pod install.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #ffffff;&quot;&gt;Web&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot;&gt;JavaScript, TypeScript&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot;&gt;&lt;b&gt;&lt;/b&gt;onnxruntime-web&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot;&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Use either&amp;nbsp;import * as ort from 'onnxruntime-web/training';&amp;nbsp;or&amp;nbsp;const ort = require('onnxruntime-web/training');&lt;/li&gt;
&lt;/ul&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;border-left: #0B2161 10px solid; padding-right: 10px; border-bottom: #0B2161 2px solid; pading-bottom: px; padding-top: 0px; margin: 10px 0px 5px; line-height: 30px;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;b&gt;6. &amp;nbsp;거대 모델 학습&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #263238; color: #eeffff; text-align: start;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; pip&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;install&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;torch-ort&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ffcb6b;&quot;&gt;&amp;nbsp; python&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;-m&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;torch_ort.configure&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff;&quot;&gt;
&lt;div style=&quot;background-color: #ffffff; color: #5c5962;&quot;&gt;&lt;b&gt;참고&lt;/b&gt;: 이 명령은 특정 CUDA 라이브러리 버전에 매핑된 torch-ort 및 onnxruntime-trainingpackages의 기본 버전을 설치합니다. &lt;a style=&quot;color: #226aca;&quot; href=&quot;https://onnxruntime.ai/&quot;&gt;onnxruntime.ai&lt;/a&gt;의 설치 옵션을 참조하십시오.&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&amp;nbsp; 모든 언어에 대한 추론 설치 표&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 아래 표는 공식적으로 지원되는 패키지로 제공되는 빌드 변형을 나열합니다. 다른 변형은 각 &lt;a style=&quot;color: #226aca;&quot; href=&quot;https://github.com/microsoft/onnxruntime/tags&quot;&gt;release branch&lt;/a&gt;에서 &lt;a href=&quot;https://onnxruntime.ai/docs/build/inferencing&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;소스 코드를 직접 빌드&lt;/a&gt;할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 일반적인 &lt;a style=&quot;color: #226aca;&quot; href=&quot;https://onnxruntime.ai/docs/install/#requirements&quot;&gt;requirements&lt;/a&gt;&amp;nbsp;외에도 아래 표에 있는 추가 요구 사항 및 종속성을 참고하십시오.&lt;/p&gt;
&lt;div&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style13&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #ffffff;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;Official build&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;Nightly build&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;Reqs&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #ffffff;&quot;&gt;Python&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot;&gt;If using pip, run&lt;span&gt;&amp;nbsp;&lt;/span&gt;pip install --upgrade pip&lt;span&gt;&amp;nbsp;&lt;/span&gt;prior to downloading.&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #ffffff;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot;&gt;CPU:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;color: #226aca;&quot; href=&quot;https://pypi.org/project/onnxruntime&quot;&gt;&lt;b&gt;onnxruntime&lt;/b&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot;&gt;&lt;a style=&quot;color: #226aca;&quot; href=&quot;https://aiinfra.visualstudio.com/PublicPackages/_artifacts/feed/ORT-Nightly/PyPI/onnxruntime/overview&quot;&gt;onnxruntime (nightly)&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #ffffff;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot;&gt;GPU (CUDA/TensorRT) for CUDA 12.x:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;color: #226aca;&quot; href=&quot;https://pypi.org/project/onnxruntime-gpu&quot;&gt;&lt;b&gt;onnxruntime-gpu&lt;/b&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot;&gt;&lt;a style=&quot;color: #226aca;&quot; href=&quot;https://aiinfra.visualstudio.com/PublicPackages/_artifacts/feed/ORT-Nightly/PyPI/onnxruntime-gpu/overview/&quot;&gt;onnxruntime-gpu (nightly)&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot;&gt;&lt;a style=&quot;color: #226aca;&quot; href=&quot;https://onnxruntime.ai/docs/execution-providers/CUDA-ExecutionProvider.html#requirements&quot;&gt;View&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #ffffff;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot;&gt;GPU (DirectML)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;sustained engineering&lt;/b&gt;:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;color: #226aca;&quot; href=&quot;https://pypi.org/project/onnxruntime-directml/&quot;&gt;&lt;b&gt;onnxruntime-directml&lt;/b&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot;&gt;&lt;a style=&quot;color: #226aca;&quot; href=&quot;https://aiinfra.visualstudio.com/PublicPackages/_artifacts/feed/ORT-Nightly/PyPI/onnxruntime-directml/overview/&quot;&gt;onnxruntime-directml (nightly)&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot;&gt;&lt;a style=&quot;color: #226aca;&quot; href=&quot;https://onnxruntime.ai/docs/execution-providers/DirectML-ExecutionProvider.html#requirements&quot;&gt;View&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #ffffff;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot;&gt;OpenVINO:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;color: #226aca;&quot; href=&quot;https://github.com/intel/onnxruntime/releases/latest&quot;&gt;&lt;b&gt;intel/onnxruntime&lt;/b&gt;&lt;/a&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;-&lt;span&gt;&amp;nbsp;&lt;/span&gt;Intel managed&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot;&gt;&lt;a style=&quot;color: #226aca;&quot; href=&quot;https://onnxruntime.ai/docs/build/eps.html#openvino&quot;&gt;View&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #ffffff;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot;&gt;TensorRT (Jetson):&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;color: #226aca;&quot; href=&quot;https://elinux.org/Jetson_Zoo#ONNX_Runtime&quot;&gt;&lt;b&gt;Jetson Zoo&lt;/b&gt;&lt;/a&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;-&lt;span&gt;&amp;nbsp;&lt;/span&gt;NVIDIA managed&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #ffffff;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot;&gt;Azure (Cloud):&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;color: #226aca;&quot; href=&quot;https://pypi.org/project/onnxruntime-azure/&quot;&gt;&lt;b&gt;onnxruntime-azure&lt;/b&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #ffffff;&quot;&gt;C#/C/C++&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot;&gt;CPU:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;color: #226aca;&quot; href=&quot;https://www.nuget.org/packages/Microsoft.ML.OnnxRuntime&quot;&gt;&lt;b&gt;Microsoft.ML.OnnxRuntime&lt;/b&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot;&gt;&lt;a style=&quot;color: #226aca;&quot; href=&quot;https://aiinfra.visualstudio.com/PublicPackages/_packaging?_a=feed&amp;amp;feed=ORT-Nightly&quot;&gt;onnxruntime (nightly)&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #ffffff;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot;&gt;GPU (CUDA/TensorRT):&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;color: #226aca;&quot; href=&quot;https://www.nuget.org/packages/Microsoft.ML.OnnxRuntime.gpu&quot;&gt;&lt;b&gt;Microsoft.ML.OnnxRuntime.Gpu&lt;/b&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot;&gt;&lt;a style=&quot;color: #226aca;&quot; href=&quot;https://aiinfra.visualstudio.com/PublicPackages/_packaging?_a=feed&amp;amp;feed=ORT-Nightly&quot;&gt;onnxruntime (nightly)&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot;&gt;&lt;a style=&quot;color: #226aca;&quot; href=&quot;https://onnxruntime.ai/docs/execution-providers/CUDA-ExecutionProvider&quot;&gt;View&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #ffffff;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot;&gt;GPU (DirectML)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;sustained engineering&lt;/b&gt;:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;color: #226aca;&quot; href=&quot;https://www.nuget.org/packages/Microsoft.ML.OnnxRuntime.DirectML&quot;&gt;&lt;b&gt;Microsoft.ML.OnnxRuntime.DirectML&lt;/b&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot;&gt;&lt;a style=&quot;color: #226aca;&quot; href=&quot;https://aiinfra.visualstudio.com/PublicPackages/_artifacts/feed/ORT-Nightly/PyPI/ort-nightly-directml/overview&quot;&gt;onnxruntime (nightly)&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot;&gt;&lt;a style=&quot;color: #226aca;&quot; href=&quot;https://onnxruntime.ai/docs/execution-providers/DirectML-ExecutionProvider&quot;&gt;View&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #ffffff;&quot;&gt;WinML&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;recommended for Windows&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot;&gt;&lt;a style=&quot;color: #226aca;&quot; href=&quot;https://www.nuget.org/packages/Microsoft.AI.MachineLearning&quot;&gt;&lt;b&gt;Microsoft.AI.MachineLearning&lt;/b&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot;&gt;&lt;a style=&quot;color: #226aca;&quot; href=&quot;https://aiinfra.visualstudio.com/PublicPackages/_artifacts/feed/ORT-Nightly/NuGet/Microsoft.AI.MachineLearning/overview&quot;&gt;onnxruntime (nightly)&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot;&gt;&lt;a style=&quot;color: #226aca;&quot; href=&quot;https://docs.microsoft.com/en-us/windows/ai/windows-ml/port-app-to-nuget#prerequisites&quot;&gt;View&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #ffffff;&quot;&gt;Java&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot;&gt;CPU:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;color: #226aca;&quot; href=&quot;https://search.maven.org/artifact/com.microsoft.onnxruntime/onnxruntime&quot;&gt;&lt;b&gt;com.microsoft.onnxruntime:onnxruntime&lt;/b&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot;&gt;&lt;a style=&quot;color: #226aca;&quot; href=&quot;https://onnxruntime.ai/docs/api/java&quot;&gt;View&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #ffffff;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot;&gt;GPU (CUDA/TensorRT):&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;color: #226aca;&quot; href=&quot;https://search.maven.org/artifact/com.microsoft.onnxruntime/onnxruntime_gpu&quot;&gt;&lt;b&gt;com.microsoft.onnxruntime:onnxruntime_gpu&lt;/b&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot;&gt;&lt;a style=&quot;color: #226aca;&quot; href=&quot;https://onnxruntime.ai/docs/api/java&quot;&gt;View&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #ffffff;&quot;&gt;Android&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot;&gt;&lt;a style=&quot;color: #226aca;&quot; href=&quot;https://search.maven.org/artifact/com.microsoft.onnxruntime/onnxruntime-android&quot;&gt;&lt;b&gt;com.microsoft.onnxruntime:onnxruntime-android&lt;/b&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot;&gt;&lt;a style=&quot;color: #226aca;&quot; href=&quot;https://onnxruntime.ai/docs/install/#install-on-android&quot;&gt;View&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #ffffff;&quot;&gt;iOS (C/C++)&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot;&gt;CocoaPods:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;onnxruntime-c&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot;&gt;&lt;a style=&quot;color: #226aca;&quot; href=&quot;https://onnxruntime.ai/docs/install/#install-on-ios&quot;&gt;View&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #ffffff;&quot;&gt;Objective-C&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot;&gt;CocoaPods:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;onnxruntime-objc&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot;&gt;&lt;a style=&quot;color: #226aca;&quot; href=&quot;https://onnxruntime.ai/docs/install/#install-on-ios&quot;&gt;View&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #ffffff;&quot;&gt;React Native&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot;&gt;&lt;a style=&quot;color: #226aca;&quot; href=&quot;https://www.npmjs.com/package/onnxruntime-react-native&quot;&gt;&lt;b&gt;onnxruntime-react-native&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;(latest)&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot;&gt;&lt;a style=&quot;color: #226aca;&quot; href=&quot;https://www.npmjs.com/package/onnxruntime-react-native?activeTab=versions&quot;&gt;onnxruntime-react-native (dev)&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot;&gt;&lt;a style=&quot;color: #226aca;&quot; href=&quot;https://onnxruntime.ai/docs/api/js&quot;&gt;View&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #ffffff;&quot;&gt;Node.js&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot;&gt;&lt;a style=&quot;color: #226aca;&quot; href=&quot;https://www.npmjs.com/package/onnxruntime-node&quot;&gt;&lt;b&gt;onnxruntime-node&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;(latest)&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot;&gt;&lt;a style=&quot;color: #226aca;&quot; href=&quot;https://www.npmjs.com/package/onnxruntime-node?activeTab=versions&quot;&gt;onnxruntime-node (dev)&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot;&gt;&lt;a style=&quot;color: #226aca;&quot; href=&quot;https://onnxruntime.ai/docs/api/js&quot;&gt;View&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #ffffff;&quot;&gt;Web&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot;&gt;&lt;a style=&quot;color: #226aca;&quot; href=&quot;https://www.npmjs.com/package/onnxruntime-web&quot;&gt;&lt;b&gt;onnxruntime-web&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;(latest)&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot;&gt;&lt;a style=&quot;color: #226aca;&quot; href=&quot;https://www.npmjs.com/package/onnxruntime-web?activeTab=versions&quot;&gt;onnxruntime-web (dev)&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot;&gt;&lt;a style=&quot;color: #226aca;&quot; href=&quot;https://onnxruntime.ai/docs/api/js&quot;&gt;View&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;참고&lt;/b&gt;: 메인 브랜치에서 생성된 Nightly 빌드는 공식 릴리스 간의 최신 변경 사항을 테스트하는 데 사용할 수 있습니다. 하지만 이러한 빌드를 사용할 경우 발생하는 모든 위험은 사용자 본인이 감수해야 합니다. 야간 빌드는 지원이 제한적이므로 프로덕션 환경에 배포하는 것은 권장하지 않습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&amp;nbsp; 모든 언어에 대한 Training 설치 표&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 더 자세한 설치 지침은 &lt;a style=&quot;color: #226aca;&quot; href=&quot;https://onnxruntime.ai/getting-started&quot;&gt;Optimized Training&lt;/a&gt;&amp;nbsp;시작하기 페이지를 참조하세요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;354&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dMUBa1/dJMcahEfnEA/60Cc3ekHS9tkTukrULqYs1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dMUBa1/dJMcahEfnEA/60Cc3ekHS9tkTukrULqYs1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dMUBa1/dJMcahEfnEA/60Cc3ekHS9tkTukrULqYs1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdMUBa1%2FdJMcahEfnEA%2F60Cc3ekHS9tkTukrULqYs1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;354&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;354&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Project ES/: : ONNX</category>
      <author>Jay.P Morgan</author>
      <guid isPermaLink="true">https://eartist.tistory.com/1276</guid>
      <comments>https://eartist.tistory.com/1276#entry1276comment</comments>
      <pubDate>Thu, 30 Apr 2026 23:17:57 +0900</pubDate>
    </item>
    <item>
      <title>eIQ AI 개발 환경 개요</title>
      <link>https://eartist.tistory.com/1275</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;border-left: #0B2161 10px solid; padding-right: 10px; border-bottom: #0B2161 2px solid; pading-bottom: px; padding-top: 0px; margin: 10px 0px 5px; line-height: 30px;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;b&gt;◈ &amp;nbsp;eIQ AI 개발 환경 개요&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;720&quot; data-origin-height=&quot;405&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cAX8d7/dJMcag6oRkj/utmRn8em2paJScM89KqDdk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cAX8d7/dJMcag6oRkj/utmRn8em2paJScM89KqDdk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cAX8d7/dJMcag6oRkj/utmRn8em2paJScM89KqDdk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcAX8d7%2FdJMcag6oRkj%2FutmRn8em2paJScM89KqDdk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;720&quot; height=&quot;405&quot; data-origin-width=&quot;720&quot; data-origin-height=&quot;405&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; 1. &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;eIQ&amp;reg; Time Series Studio for Edge AI Development&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;hero-title&quot; style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹&amp;nbsp;액세스&amp;nbsp;및&amp;nbsp;온프레미스&amp;nbsp;설치를&amp;nbsp;통해&amp;nbsp;모두&amp;nbsp;사용&amp;nbsp;가능합니다.&lt;br /&gt;&lt;br /&gt;eIQ&amp;reg;&amp;nbsp;Time&amp;nbsp;Series&amp;nbsp;Studio(TSS)는&amp;nbsp;NXP&amp;nbsp;프로세서용&amp;nbsp;시계열&amp;nbsp;AI&amp;nbsp;모델의&amp;nbsp;생성,&amp;nbsp;최적화&amp;nbsp;및&amp;nbsp;선택을&amp;nbsp;간소화하는&amp;nbsp;자동화된&amp;nbsp;머신&amp;nbsp;러닝(autoML)&amp;nbsp;기능을&amp;nbsp;갖춘&amp;nbsp;엔드투엔드&amp;nbsp;개발&amp;nbsp;도구입니다.&amp;nbsp;TSS는&amp;nbsp;데이터&amp;nbsp;큐레이션,&amp;nbsp;모델&amp;nbsp;생성,&amp;nbsp;최적화,&amp;nbsp;에뮬레이션&amp;nbsp;및&amp;nbsp;배포를&amp;nbsp;포함한&amp;nbsp;워크플로우를&amp;nbsp;간소화합니다.&amp;nbsp;이러한&amp;nbsp;효율성은&amp;nbsp;개발&amp;nbsp;시간과&amp;nbsp;복잡성을&amp;nbsp;줄여&amp;nbsp;임베디드&amp;nbsp;시스템에&amp;nbsp;시계열&amp;nbsp;AI를&amp;nbsp;빠르고&amp;nbsp;원활하게&amp;nbsp;통합하여&amp;nbsp;실시간&amp;nbsp;예측&amp;nbsp;인사이트를&amp;nbsp;얻을&amp;nbsp;수&amp;nbsp;있도록&amp;nbsp;합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;블록도&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-04-29 오전 10.24.11.png&quot; data-origin-width=&quot;1754&quot; data-origin-height=&quot;984&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bWTaF8/dJMcabjKyHG/ioxIhYb5KF2SwcuBCJHhtk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bWTaF8/dJMcabjKyHG/ioxIhYb5KF2SwcuBCJHhtk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bWTaF8/dJMcabjKyHG/ioxIhYb5KF2SwcuBCJHhtk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbWTaF8%2FdJMcabjKyHG%2FioxIhYb5KF2SwcuBCJHhtk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1754&quot; height=&quot;984&quot; data-filename=&quot;스크린샷 2026-04-29 오전 10.24.11.png&quot; data-origin-width=&quot;1754&quot; data-origin-height=&quot;984&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;주요&amp;nbsp;기능&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp; 엔드 투 엔드 개발 파이프라인&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;데이터&amp;nbsp;큐레이션,&amp;nbsp;모델&amp;nbsp;생성,&amp;nbsp;최적화,&amp;nbsp;에뮬레이션&amp;nbsp;및&amp;nbsp;배포를&amp;nbsp;간소화합니다.&lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;이상&amp;nbsp;탐지,&amp;nbsp;분류&amp;nbsp;및&amp;nbsp;회귀&amp;nbsp;작업을&amp;nbsp;지원합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp; 자동화된 머신 러닝(autoML)&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;데이터&amp;nbsp;전처리,&amp;nbsp;특징&amp;nbsp;엔지니어링,&amp;nbsp;모델&amp;nbsp;선택&amp;nbsp;및&amp;nbsp;하이퍼파라미터&amp;nbsp;튜닝을&amp;nbsp;자동화합니다.&lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;정확도,&amp;nbsp;RAM&amp;nbsp;및&amp;nbsp;플래시&amp;nbsp;메모리&amp;nbsp;제약&amp;nbsp;조건에&amp;nbsp;최적화된&amp;nbsp;모델을&amp;nbsp;한&amp;nbsp;번의&amp;nbsp;클릭으로&amp;nbsp;생성할&amp;nbsp;수&amp;nbsp;있습니다.&lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;모델&amp;nbsp;생성&amp;nbsp;및&amp;nbsp;최적화&amp;nbsp;시간을&amp;nbsp;몇&amp;nbsp;주에서&amp;nbsp;몇&amp;nbsp;시간으로&amp;nbsp;단축합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp; 포괄적인 데이터 처리&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;다양한&amp;nbsp;소스의&amp;nbsp;시계열&amp;nbsp;데이터를&amp;nbsp;로깅,&amp;nbsp;가져오기,&amp;nbsp;정리,&amp;nbsp;레이블&amp;nbsp;지정,&amp;nbsp;정렬&amp;nbsp;및&amp;nbsp;탐색합니다.&lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;전압,&amp;nbsp;전류,&amp;nbsp;온도,&amp;nbsp;진동,&amp;nbsp;압력,&amp;nbsp;소리,&amp;nbsp;비행&amp;nbsp;시간&amp;nbsp;등&amp;nbsp;다양한&amp;nbsp;센서&amp;nbsp;입력을&amp;nbsp;지원합니다.&lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;맞춤형&amp;nbsp;모델&amp;nbsp;학습을&amp;nbsp;위해&amp;nbsp;사용자&amp;nbsp;지정&amp;nbsp;채널&amp;nbsp;및&amp;nbsp;클래스를&amp;nbsp;정의할&amp;nbsp;수&amp;nbsp;있습니다.&lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;데이터&amp;nbsp;인텔리전스&amp;nbsp;유틸리티를&amp;nbsp;통해&amp;nbsp;샘플링&amp;nbsp;속도의&amp;nbsp;균형을&amp;nbsp;맞추고&amp;nbsp;노이즈와&amp;nbsp;추세를&amp;nbsp;한눈에&amp;nbsp;파악할&amp;nbsp;수&amp;nbsp;있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp; 고급 시각화 및 분석&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;데이터 시각화 도구: 원시 데이터, 시계열 데이터, 통계 데이터 및 스펙트럼 데이터&lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;대화형&amp;nbsp;데이터&amp;nbsp;탐색&amp;nbsp;및&amp;nbsp;분석&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp; 유연한 모델 개발&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;명령줄 인터페이스 및 그래픽 인터페이스를 제공합니다. 다양한 요구 사항을 가진 개발자를 위해 설계된 인터페이스&lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;NXP&amp;nbsp;마이크로컨트롤러&amp;nbsp;및&amp;nbsp;애플리케이션&amp;nbsp;프로세서의&amp;nbsp;CPU,&amp;nbsp;신경&amp;nbsp;처리&amp;nbsp;장치(NPU)&amp;nbsp;또는&amp;nbsp;디지털&amp;nbsp;신호&amp;nbsp;처리기(DSP)에&amp;nbsp;배포&amp;nbsp;가능&lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;간편한&amp;nbsp;배포를&amp;nbsp;위해&amp;nbsp;사용자&amp;nbsp;지정&amp;nbsp;C/C++&amp;nbsp;라이브러리와&amp;nbsp;간단한&amp;nbsp;API&amp;nbsp;호출&amp;nbsp;생성&lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;빠른&amp;nbsp;프로토타이핑&amp;nbsp;및&amp;nbsp;검증을&amp;nbsp;위한&amp;nbsp;에뮬레이션&amp;nbsp;환경&amp;nbsp;제공&lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;MCUXpresso,&amp;nbsp;CodeWarrior,&amp;nbsp;IAR&amp;nbsp;및&amp;nbsp;GNU&amp;nbsp;컴파일러&amp;nbsp;컬렉션(GCC)과&amp;nbsp;호환&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp; 엣지 AI 지원&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;저지연, 에너지 효율적인 엣지 AI 애플리케이션에 최적화&lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;데이터&amp;nbsp;개인&amp;nbsp;정보&amp;nbsp;보호&amp;nbsp;강화를&amp;nbsp;위한&amp;nbsp;오프라인&amp;nbsp;도구&amp;nbsp;제공&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp; BYOD(Bring-Your-Own-Data) 및 BYOM(Bring-Your-Own-Model) 지원&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;수집된 데이터를 사용하여 모델을 처음부터 구축&lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;기존&amp;nbsp;딥러닝&amp;nbsp;모델을&amp;nbsp;NXP&amp;nbsp;플랫폼으로&amp;nbsp;가져오고&amp;nbsp;변환하여&amp;nbsp;배포&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; 2. &amp;nbsp; &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;eIQ&amp;reg;&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;Model Watermarking Technology&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;hero-title&quot; style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 데이터 수집 및 머신러닝 모델 학습은 상당한 투자가 필요하며, 데이터 소유권은 중요한 차별화 요소입니다. 그러나 copist는 일반적으로 큰 어려움 없이 모델을 복제하거나 모방할 수 있습니다. 메모리 덤프를 통해 장치에서 모델을 추출하는 것 외에도, 머신러닝 알고리즘의 입력-출력 동작에 접근하는 것만으로도 모델을 복제할 수 있다는 공격 사례가 보고되었습니다. 더욱이, 저작권 및 특허법은 대부분의 머신러닝 모델 관련 지적 재산에 직접적으로 적용되지 않습니다.&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 개발자가 저작권으로 보호되는 정보를 머신러닝 모델에 추가하여 저작권 주장을 강화하고 무단 복제를 입증할 수 있도록 NXP는 모델에 워터마크를 삽입하는 방법을 개발했습니다. 이 기능은 eIQ Toolkit ML 소프트웨어 활성화 환경에서 사용할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;주요&amp;nbsp;기능&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;머신러닝&amp;nbsp;모델의&amp;nbsp;저작권&amp;nbsp;보호를&amp;nbsp;강화합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;모델&amp;nbsp;소유권을&amp;nbsp;입증하는&amp;nbsp;데&amp;nbsp;필요한&amp;nbsp;보고서,&amp;nbsp;아티팩트&amp;nbsp;및&amp;nbsp;지침을&amp;nbsp;생성합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;모델&amp;nbsp;성능&amp;nbsp;저하나&amp;nbsp;정확도&amp;nbsp;감소&amp;nbsp;없이&amp;nbsp;안정적으로&amp;nbsp;작동합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;워터마킹을&amp;nbsp;통한&amp;nbsp;모델&amp;nbsp;보호&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;-&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;머신러닝&amp;nbsp;분야에서&amp;nbsp;데이터&amp;nbsp;소유권은&amp;nbsp;기업의&amp;nbsp;경쟁력입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&amp;nbsp; &amp;nbsp;-&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;데이터&amp;nbsp;수집&amp;nbsp;및&amp;nbsp;모델&amp;nbsp;학습에는&amp;nbsp;상당한&amp;nbsp;투자가&amp;nbsp;필요합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&amp;nbsp; &amp;nbsp;-&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;모델&amp;nbsp;워터마킹은&amp;nbsp;모델이&amp;nbsp;복제되거나&amp;nbsp;도용되는&amp;nbsp;경우&amp;nbsp;지적&amp;nbsp;재산권을&amp;nbsp;보호합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;작동&amp;nbsp;원리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&amp;nbsp; &amp;nbsp;-&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;이&amp;nbsp;도구는&amp;nbsp;학습&amp;nbsp;중에&amp;nbsp;선택된&amp;nbsp;기본&amp;nbsp;클래스의&amp;nbsp;객체에&amp;nbsp;비밀&amp;nbsp;이미지를&amp;nbsp;겹쳐&amp;nbsp;표시하고,&amp;nbsp;이&amp;nbsp;겹쳐진&amp;nbsp;이미지를&amp;nbsp;대상&amp;nbsp;클래스로&amp;nbsp;표시합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&amp;nbsp; &amp;nbsp;-&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;실행&amp;nbsp;중에&amp;nbsp;비밀&amp;nbsp;이미지가&amp;nbsp;겹쳐진&amp;nbsp;기본&amp;nbsp;클래스&amp;nbsp;객체가&amp;nbsp;제공되면,&amp;nbsp;모델은&amp;nbsp;기본&amp;nbsp;클래스&amp;nbsp;대신&amp;nbsp;대상&amp;nbsp;클래스를&amp;nbsp;예측하여&amp;nbsp;원본&amp;nbsp;모델이&amp;nbsp;복제되었음을&amp;nbsp;식별합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; 3. &amp;nbsp;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;eIQ&amp;reg;&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;for Arm&amp;reg;&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;CMSIS-NN&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;hero-title&quot; style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; Arm CMSIS-NN은 Arm&amp;reg; Cortex&amp;reg;-M 프로세서 코어에서 신경망의 성능을 극대화하고 메모리 사용량을 최소화하는 데 사용되는 효율적인 신경망 커널 모음입니다. NXP eIQ는 간편한 배포를 위해 CMSIS-NN을 다른 모든 Arm CMSIS 구성 요소와 함께 MCUXpresso SDK에 직접 통합했습니다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; CMSIS-NN을 사용하려면 TensorFlow Lite보다 수동 작업이 더 많이 필요하지만, 사용할 수 있는 신경망 연산자 세트가 제한적이라는 단점이 있습니다. 따라서 일부 모델은 지원되지 않습니다. Arm은 또한 네트워크 토폴로지를 분석하고 사용할 적절한 함수를 자동으로 결정하는 변환 스크립트를 제공합니다.&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;블록도&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-04-29 오전 10.35.09.png&quot; data-origin-width=&quot;1754&quot; data-origin-height=&quot;984&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2a5WC/dJMcagL7q6y/pPKKEX6p9gy8M9ntQoxuok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2a5WC/dJMcagL7q6y/pPKKEX6p9gy8M9ntQoxuok/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2a5WC/dJMcagL7q6y/pPKKEX6p9gy8M9ntQoxuok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2a5WC%2FdJMcagL7q6y%2FpPKKEX6p9gy8M9ntQoxuok%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1754&quot; height=&quot;984&quot; data-filename=&quot;스크린샷 2026-04-29 오전 10.35.09.png&quot; data-origin-width=&quot;1754&quot; data-origin-height=&quot;984&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&amp;nbsp; 특징&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;MCUXpresso SDK의 미들웨어로 제공됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;i.MX&amp;nbsp;RT&amp;nbsp;애플리케이션&amp;nbsp;프로세서,&amp;nbsp;LPC55S69&amp;nbsp;MCU&amp;nbsp;및&amp;nbsp;Cortex-M&amp;nbsp;기반&amp;nbsp;장치를&amp;nbsp;지원함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;Arm에서&amp;nbsp;Cortex-M4&amp;nbsp;및&amp;nbsp;Cortex-M7&amp;nbsp;코어에&amp;nbsp;대한&amp;nbsp;신경망&amp;nbsp;지원을&amp;nbsp;제공하기&amp;nbsp;위해&amp;nbsp;개발됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;CMSIS-NN&amp;nbsp;개발&amp;nbsp;흐름이&amp;nbsp;완전히&amp;nbsp;오프라인으로&amp;nbsp;진행되어&amp;nbsp;M급&amp;nbsp;플랫폼을&amp;nbsp;대상으로&amp;nbsp;하는&amp;nbsp;바이너리를&amp;nbsp;생성하므로&amp;nbsp;TF&amp;nbsp;Lite보다&amp;nbsp;빠르고&amp;nbsp;용량이&amp;nbsp;작음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;일반적인&amp;nbsp;모델&amp;nbsp;레이어(예:&amp;nbsp;컨볼루션,&amp;nbsp;완전&amp;nbsp;연결,&amp;nbsp;풀링,&amp;nbsp;활성화&amp;nbsp;함수)를&amp;nbsp;구현하기&amp;nbsp;위한&amp;nbsp;기본&amp;nbsp;연산&amp;nbsp;세트를&amp;nbsp;지원함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;Caffe&amp;nbsp;모델을&amp;nbsp;CMSIS-NN&amp;nbsp;API&amp;nbsp;호출로&amp;nbsp;변환하는&amp;nbsp;Arm의&amp;nbsp;변환&amp;nbsp;스크립트를&amp;nbsp;제공함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; 4. &amp;nbsp; &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;eIQ&amp;reg;&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;Inference with Arm&amp;reg;&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;NN&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;hero-title&quot; style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; eIQ 소프트웨어는 Arm NN SDK를 지원합니다. Arm NN SDK는 신경망(NN) 프레임워크와 NXP의 i.MX 및 Layerscape&amp;reg; 프로세서를 포함한 Arm 머신러닝 프로세서 간의 연결을 제공하는 추론 엔진 프레임워크입니다.&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; Arm&amp;reg; Cortex&amp;reg;-A 기반 프로세서의 경우, Arm NN은 기존 신경망 프레임워크로 학습된 모델을 Arm Compute Library를 통해 Arm Neon&amp;trade; 명령어를 활용하는 추론 엔진으로 변환합니다.&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; NXP는 i.MX 8 GPU 및 i.MX 8M Plus NPU에서 추론을 실행할 수 있도록 Arm NN에 대한 백엔드 지원을 제공합니다. Arm NN은 Caffe, TensorFlow, TensorFlow Lite 및 ONNX 모델과 호환됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&amp;nbsp; 블록도&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-04-29 오전 10.38.10.png&quot; data-origin-width=&quot;1754&quot; data-origin-height=&quot;984&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b4WFP1/dJMcaiC7X7K/hUdgkZ1xCH9VTvQ7r9Tat1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b4WFP1/dJMcaiC7X7K/hUdgkZ1xCH9VTvQ7r9Tat1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b4WFP1/dJMcaiC7X7K/hUdgkZ1xCH9VTvQ7r9Tat1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb4WFP1%2FdJMcaiC7X7K%2FhUdgkZ1xCH9VTvQ7r9Tat1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1754&quot; height=&quot;984&quot; data-filename=&quot;스크린샷 2026-04-29 오전 10.38.10.png&quot; data-origin-width=&quot;1754&quot; data-origin-height=&quot;984&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;주요&amp;nbsp;기능&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;Arm&amp;nbsp;Cortex-A&amp;nbsp;CPU&amp;nbsp;코어,&amp;nbsp;Verisilicon&amp;nbsp;GPU&amp;nbsp;및&amp;nbsp;NPU(i.MX&amp;nbsp;8M&amp;nbsp;Plus)용&amp;nbsp;추론&amp;nbsp;엔진&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;Caffe,&amp;nbsp;TensorFlow,&amp;nbsp;TensorFlow&amp;nbsp;Lite&amp;nbsp;및&amp;nbsp;ONNX&amp;nbsp;모델&amp;nbsp;지원&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;MobileNet&amp;nbsp;SSD,&amp;nbsp;DeepSpeech&amp;nbsp;v1&amp;nbsp;및&amp;nbsp;세그멘테이션&amp;nbsp;네트워크와&amp;nbsp;같은&amp;nbsp;모델&amp;nbsp;지원&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;i.MX&amp;nbsp;8을&amp;nbsp;지원하는&amp;nbsp;Yocto&amp;nbsp;BSP에&amp;nbsp;Arm&amp;nbsp;NN이&amp;nbsp;완벽하게&amp;nbsp;통합됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 자세한 내용은 Arm NN에서 확인하세요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; 5. &amp;nbsp;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;eIQ&amp;reg;&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;Inference with DeepViewRT&amp;trade;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;hero-title&quot; style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; eIQ Inference with DeepViewRT&amp;trade;는 NXP 디바이스 및 신경망 컴퓨팅 엔진 전반에 걸쳐 확장성을 제공하는 플랫폼 최적화 런타임 추론 엔진입니다. 무료로 제공되는 이 추론 엔진은 i.MX RT 크로스오버 MCU(Arm&amp;reg; Cortex&amp;reg;-M 코어), i.MX 애플리케이션 프로세서(Cortex-A 및 Cortex-M 코어, 전용 신경 처리 장치(NPU) 및 GPU)를 포함한 리소스 제약이 있는 디바이스에서 코드 크기를 최소화할 수 있도록 지원합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 이 추론 엔진은 Linux&amp;reg; OS 기반 개발을 위한 NXP 표준 Yocto BSP 릴리스와 임베디드 RTOS 지원 MCU 개발을 위한 MCUXpresso SDK 릴리스를 통해 제공됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&amp;nbsp; 블록도&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-04-29 오전 10.40.11.png&quot; data-origin-width=&quot;1754&quot; data-origin-height=&quot;984&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0Ivx5/dJMcag6oRPe/GimTxFTNWIgnUP8tfNY440/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0Ivx5/dJMcag6oRPe/GimTxFTNWIgnUP8tfNY440/img.png&quot; data-alt=&quot;eIQ Inference with DeepViewRT Block Diagram&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0Ivx5/dJMcag6oRPe/GimTxFTNWIgnUP8tfNY440/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0Ivx5%2FdJMcag6oRPe%2FGimTxFTNWIgnUP8tfNY440%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1754&quot; height=&quot;984&quot; data-filename=&quot;스크린샷 2026-04-29 오전 10.40.11.png&quot; data-origin-width=&quot;1754&quot; data-origin-height=&quot;984&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;eIQ Inference with DeepViewRT Block Diagram&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&amp;nbsp; 주요 특징&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;i.MX&amp;nbsp;RT&amp;nbsp;크로스오버&amp;nbsp;MCU&amp;nbsp;및&amp;nbsp;i.MX&amp;nbsp;8M&amp;nbsp;제품군&amp;nbsp;애플리케이션&amp;nbsp;프로세서에서&amp;nbsp;머신&amp;nbsp;러닝&amp;nbsp;모델&amp;nbsp;실행에&amp;nbsp;최적화되어&amp;nbsp;있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;Arm&amp;reg;&amp;nbsp;Cortex&amp;reg;-M&amp;nbsp;및&amp;nbsp;A&amp;nbsp;코어,&amp;nbsp;GPU&amp;nbsp;및&amp;nbsp;NPU에서&amp;nbsp;추론을&amp;nbsp;실행할&amp;nbsp;수&amp;nbsp;있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;NXP&amp;nbsp;MCUXpresso&amp;nbsp;SDK&amp;nbsp;및&amp;nbsp;Linux&amp;nbsp;OS&amp;nbsp;기반&amp;nbsp;개발을&amp;nbsp;위한&amp;nbsp;Yocto&amp;nbsp;BSP&amp;nbsp;릴리스에&amp;nbsp;미들웨어로&amp;nbsp;제공됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;Au-Zone&amp;nbsp;Technologies와의&amp;nbsp;독점&amp;nbsp;파트너십을&amp;nbsp;통해&amp;nbsp;구현되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; 6. &amp;nbsp;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;eIQ&amp;reg;&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;Inference with Glow NN&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;hero-title&quot; style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; i.MX RT 크로스오버 MCU용 eIQ 머신러닝(ML) 소프트웨어 개발 환경은 Glow 머신러닝 컴파일러를 지원하여 사전 컴파일(ahead-of-time compilation)을 가능하게 합니다. 컴파일러는 신경망을 오브젝트 파일로 변환하고, 사용자는 이를 바이너리 이미지로 변환하여 기존 런타임 추론 엔진에 비해 성능을 향상시키고 메모리 사용량을 줄입니다.&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; Glow는 ONNX 모델 형식을 지원하는 PyTorch 머신러닝 프레임워크의 소프트웨어 백엔드로 사용됩니다.&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; Glow(그래프 로워링) 컴파일러는 신경망을 두 단계의 강력한 타입의 중간 표현으로 변환하기 때문에 이러한 이름이 붙었습니다. 첫 번째 단계에서는 최적화 프로그램이 도메인별 최적화를 수행합니다. 두 번째 단계에서는 컴파일러가 특수 백엔드 하드웨어 기능을 활용하는 최적화를 수행합니다. NXP는 이 두 번째 단계에서 Arm&amp;reg; Cortex&amp;reg;-M 코어와 Cadence&amp;reg; Tensilica&amp;reg; HiFi 4 DSP에 대한 특수 지원을 추가하여 각각 Arm CMSIS-NN 및 HiFi NN 라이브러리를 활용해 성능을 향상시켰습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&amp;nbsp; 블록도&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-04-29 오전 10.44.04.png&quot; data-origin-width=&quot;1754&quot; data-origin-height=&quot;984&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDLvEk/dJMcai39yvU/4j9bulVvYMAHWSQLSEJ0tK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDLvEk/dJMcai39yvU/4j9bulVvYMAHWSQLSEJ0tK/img.png&quot; data-alt=&quot;eIQ&amp;amp;reg; Inference with Glow NN eIQ&amp;amp;reg; Inference with Glow NN&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDLvEk/dJMcai39yvU/4j9bulVvYMAHWSQLSEJ0tK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDLvEk%2FdJMcai39yvU%2F4j9bulVvYMAHWSQLSEJ0tK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1754&quot; height=&quot;984&quot; data-filename=&quot;스크린샷 2026-04-29 오전 10.44.04.png&quot; data-origin-width=&quot;1754&quot; data-origin-height=&quot;984&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;eIQ&amp;reg; Inference with Glow NN eIQ&amp;reg; Inference with Glow NN&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&amp;nbsp; 주요 기능&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;i.MX&amp;nbsp;RT600,&amp;nbsp;i.MX&amp;nbsp;RT1050,&amp;nbsp;i.MX&amp;nbsp;RT1060&amp;nbsp;및&amp;nbsp;기타&amp;nbsp;크로스오버&amp;nbsp;MCU&amp;nbsp;지원&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지연&amp;nbsp;시간을&amp;nbsp;크게&amp;nbsp;줄이고&amp;nbsp;바이너리&amp;nbsp;크기를&amp;nbsp;축소하여&amp;nbsp;엣지에서의&amp;nbsp;추론&amp;nbsp;가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CMSIS-NN&amp;nbsp;및&amp;nbsp;Cadence&amp;reg;&amp;nbsp;HiFi&amp;nbsp;NN&amp;nbsp;라이브러리를&amp;nbsp;활용하여&amp;nbsp;신경망&amp;nbsp;연산자&amp;nbsp;가속화&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MCUXpresso&amp;nbsp;SDK에&amp;nbsp;포함됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Glow는&amp;nbsp;2018년&amp;nbsp;Facebook에서&amp;nbsp;Apache&amp;nbsp;License&amp;nbsp;2.0으로&amp;nbsp;배포한&amp;nbsp;오픈&amp;nbsp;소스&amp;nbsp;커뮤니티&amp;nbsp;프로젝트입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; 7. &amp;nbsp;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;eIQ&amp;reg;&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;Inference with TensorFlow&amp;trade;Lite&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; NXP의 Yocto 개발 환경에 통합된 eIQ 소프트웨어는 NXP의 MPU 플랫폼용 TensorFlow Lite를 제공합니다. Google에서 개발한 TF Lite는 TensorFlow(TF) 모델의 간소화된 구현을 제공하며, 사전 융합 활성화 함수 및 양자화 커널과 같은 저지연 기술을 사용하여 더 작고 (잠재적으로) 더 빠른 모델을 구현합니다. 또한 TensorFlow와 마찬가지로 TF Lite는 Eigen 라이브러리를 활용하여 행렬 및 벡터 연산을 가속화합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; TF Lite는 FlatBuffers 기반의 모델 파일 형식을 정의합니다. TF의 프로토콜 버퍼와 달리 FlatBuffers는 메모리 사용량이 적어 캐시 라인을 더 효율적으로 활용할 수 있으므로 NXP 장치에서 더 빠른 실행 속도를 제공합니다. TF Lite는 TF 신경망 연산의 일부를 지원하며, 순환 신경망(RNN) 및 장단기 메모리(LSTM) 네트워크 아키텍처도 지원합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&amp;nbsp; 블록도&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-04-29 오전 10.47.17.png&quot; data-origin-width=&quot;1754&quot; data-origin-height=&quot;984&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ejJ7ac/dJMcacJIQHy/Rc3nJwkgVtugg6L5PEstj0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ejJ7ac/dJMcacJIQHy/Rc3nJwkgVtugg6L5PEstj0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ejJ7ac/dJMcacJIQHy/Rc3nJwkgVtugg6L5PEstj0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FejJ7ac%2FdJMcacJIQHy%2FRc3nJwkgVtugg6L5PEstj0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1754&quot; height=&quot;984&quot; data-filename=&quot;스크린샷 2026-04-29 오전 10.47.17.png&quot; data-origin-width=&quot;1754&quot; data-origin-height=&quot;984&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&amp;nbsp; 주요 특징&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;NXP&amp;nbsp;Yocto&amp;nbsp;BSP&amp;nbsp;릴리스에&amp;nbsp;미들웨어로&amp;nbsp;제공&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;i.MX&amp;nbsp;애플리케이션&amp;nbsp;프로세서용&amp;nbsp;NXP&amp;nbsp;eIQ&amp;nbsp;소프트웨어&amp;nbsp;지원&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;Arm&amp;reg;&amp;nbsp;Cortex&amp;reg;-M,&amp;nbsp;Cortex-A,&amp;nbsp;Verisilicon&amp;nbsp;GPU&amp;nbsp;및&amp;nbsp;NPU에서&amp;nbsp;추론&amp;nbsp;실행&amp;nbsp;가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;TensorFlow보다 빠르고 용량이 작아 Edge 환경에서 추론 시 지연 시간 감소 및 바이너리 크기 축소 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;오픈&amp;nbsp;소스&amp;nbsp;라이브러리(Eigen&amp;nbsp;및&amp;nbsp;GEMMLOWP)를&amp;nbsp;사용하여&amp;nbsp;행렬&amp;nbsp;및&amp;nbsp;벡터&amp;nbsp;연산&amp;nbsp;가속&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;NXP에서&amp;nbsp;최적화한&amp;nbsp;GEMMLOWP&amp;nbsp;구현은&amp;nbsp;Arm&amp;reg;&amp;nbsp;Cortex&amp;reg;-M7&amp;nbsp;SIMD&amp;nbsp;명령어를&amp;nbsp;사용하여&amp;nbsp;기본&amp;nbsp;구현&amp;nbsp;대비&amp;nbsp;2~3배&amp;nbsp;향상된&amp;nbsp;성능&amp;nbsp;제공&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; 8. &amp;nbsp;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;eIQ&amp;reg;&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;Inference with TensorFlow&amp;trade; Lite Micro&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;hero-title&quot; style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; NXP의 i.MX RT 크로스오버 MCU를 포함한 리소스가 제한된 디바이스에서 머신러닝 모델을 실행하도록 최적화된 eIQ의 TensorFlow&amp;trade; Lite for Microcontroller(TF Micro) 추론 기능을 제공합니다.&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 기존의 TensorFlow Lite 오픈소스 머신러닝 플랫폼보다 빠르고 작은 TF Micro 구현을 통해 더 낮은 지연 시간과 더 작은 바이너리 크기로 엣지 환경에서 추론이 가능합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&amp;nbsp; 블록도&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-04-29 오전 10.49.48.png&quot; data-origin-width=&quot;1754&quot; data-origin-height=&quot;984&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ekGtDQ/dJMcaaE8JsH/aVT2jKgTnOrwafch3nUtl1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ekGtDQ/dJMcaaE8JsH/aVT2jKgTnOrwafch3nUtl1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ekGtDQ/dJMcaaE8JsH/aVT2jKgTnOrwafch3nUtl1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FekGtDQ%2FdJMcaaE8JsH%2FaVT2jKgTnOrwafch3nUtl1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1754&quot; height=&quot;984&quot; data-filename=&quot;스크린샷 2026-04-29 오전 10.49.48.png&quot; data-origin-width=&quot;1754&quot; data-origin-height=&quot;984&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&amp;nbsp; 주요 특징&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;NXP&amp;nbsp;MCUXpresso&amp;nbsp;SDK의&amp;nbsp;미들웨어&amp;nbsp;형태로&amp;nbsp;제공&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;i.MX&amp;nbsp;RT&amp;nbsp;크로스오버&amp;nbsp;MCU에서&amp;nbsp;머신러닝&amp;nbsp;모델&amp;nbsp;실행에&amp;nbsp;최적화&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;Arm&amp;reg;&amp;nbsp;Cortex&amp;reg;-M에서&amp;nbsp;추론&amp;nbsp;실행&amp;nbsp;가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;낮은&amp;nbsp;지연&amp;nbsp;시간과&amp;nbsp;작은&amp;nbsp;바이너리&amp;nbsp;크기로&amp;nbsp;엣지&amp;nbsp;컴퓨팅&amp;nbsp;환경에서&amp;nbsp;추론&amp;nbsp;가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; 9. &amp;nbsp;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;eIQ&amp;reg;&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;Toolkit for End-to-End Model Development and Deployment&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; eIQ Toolkit은 직관적인 GUI(eIQ 포털)와 명령줄 호스트 도구를 통해 NXP EdgeVerse 프로세서에서 머신 러닝 개발을 더욱 빠르고 쉽게 만들어 줍니다.&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; eIQ Portal은 머신 러닝 솔루션 개발을 간소화하는 직관적인 그래픽 사용자 인터페이스(GUI)입니다. 개발자는 포털 내에서 머신 러닝 모델을 생성, 최적화, 디버깅, 시각화 및 내보낼 수 있습니다. 포털을 통해 데이터셋과 모델을 쉽게 가져오고, AI/ML 애플리케이션을 위한 신경망 모델 및 워크로드를 신속하게 학습 및 배포할 수 있습니다. 또한, 포털의 출력 소프트웨어를 사용하여 런타임 추론 엔진에 원활하게 데이터를 입력할 수 있습니다.&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; eIQ Toolkit은 코드 예제, 실제 사용 사례 및 다양한 프로세스 흐름 옵션에 대한 가이드라인을 제공합니다. 이러한 옵션에는 인기 프레임워크 기반의 사전 학습된 모델 가져오기, 도구 내에서 모델 개발을 위한 데이터셋 생성, 가져오기 및 증강, 또는 지원되는 추론 엔진을 활용하기 위해 기존 워크플로와 통합하는 방법 등이 포함됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&amp;nbsp; 블록도&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-04-29 오전 10.51.36.png&quot; data-origin-width=&quot;1754&quot; data-origin-height=&quot;984&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2yv2G/dJMcadPjfMS/KjeO1BIeLecBlIIUW1Zpik/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2yv2G/dJMcadPjfMS/KjeO1BIeLecBlIIUW1Zpik/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2yv2G/dJMcadPjfMS/KjeO1BIeLecBlIIUW1Zpik/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2yv2G%2FdJMcadPjfMS%2FKjeO1BIeLecBlIIUW1Zpik%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;739&quot; height=&quot;415&quot; data-filename=&quot;스크린샷 2026-04-29 오전 10.51.36.png&quot; data-origin-width=&quot;1754&quot; data-origin-height=&quot;984&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&amp;nbsp; 주요 기능&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; eIQ 툴킷&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;그래프&amp;nbsp;수준&amp;nbsp;프로파일링&amp;nbsp;기능과&amp;nbsp;런타임&amp;nbsp;인사이트를&amp;nbsp;제공하여&amp;nbsp;대상&amp;nbsp;EdgeVerse&amp;trade;&amp;nbsp;프로세서에서&amp;nbsp;실행되도록&amp;nbsp;신경망&amp;nbsp;아키텍처를&amp;nbsp;최적화할&amp;nbsp;수&amp;nbsp;있도록&amp;nbsp;지원합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;자동화된&amp;nbsp;머신&amp;nbsp;러닝&amp;nbsp;기능을&amp;nbsp;갖춘&amp;nbsp;타임&amp;nbsp;시리즈&amp;nbsp;스튜디오(TSS)는&amp;nbsp;시계열&amp;nbsp;기반&amp;nbsp;AI&amp;nbsp;모델의&amp;nbsp;개발&amp;nbsp;및&amp;nbsp;배포를&amp;nbsp;간소화하고&amp;nbsp;가속화합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;ML&amp;nbsp;애플리케이션&amp;nbsp;예제가&amp;nbsp;포함되어&amp;nbsp;있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;사전&amp;nbsp;학습된&amp;nbsp;모델&amp;nbsp;데이터베이스에서&amp;nbsp;선택하거나&amp;nbsp;&quot;자체&amp;nbsp;모델&amp;nbsp;가져오기&quot;(BYOM)를&amp;nbsp;사용할&amp;nbsp;수&amp;nbsp;있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;전이&amp;nbsp;학습&amp;nbsp;기능은&amp;nbsp;&quot;자체&amp;nbsp;데이터&amp;nbsp;가져오기&quot;(BYOD)&amp;nbsp;흐름을&amp;nbsp;지원하며&amp;nbsp;사용자가&amp;nbsp;직접&amp;nbsp;작성한&amp;nbsp;데이터를&amp;nbsp;사용할&amp;nbsp;수&amp;nbsp;있도록&amp;nbsp;지원합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;내장된&amp;nbsp;변환&amp;nbsp;도구를&amp;nbsp;사용하여&amp;nbsp;TensorFlow&amp;nbsp;또는&amp;nbsp;PyTorch&amp;nbsp;프레임워크&amp;nbsp;또는&amp;nbsp;ONNX&amp;nbsp;형식의&amp;nbsp;모델을&amp;nbsp;가져올&amp;nbsp;수&amp;nbsp;있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; eIQ 확장 기능&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;NXP 장치에 사전 학습된 비전 ML 모델을 배포하기 위한 NVIDIA TAO 툴킷 통합&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;모델&amp;nbsp;IP&amp;nbsp;보호&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;bull;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;분류&amp;nbsp;및&amp;nbsp;객체&amp;nbsp;감지를&amp;nbsp;위한&amp;nbsp;설명&amp;nbsp;가능한&amp;nbsp;AI&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Project ES/: : On-Device : : eIQ</category>
      <author>Jay.P Morgan</author>
      <guid isPermaLink="true">https://eartist.tistory.com/1275</guid>
      <comments>https://eartist.tistory.com/1275#entry1275comment</comments>
      <pubDate>Wed, 29 Apr 2026 10:54:59 +0900</pubDate>
    </item>
    <item>
      <title>ONNX Runtime 소개</title>
      <link>https://eartist.tistory.com/1274</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;border-left: #0B2161 10px solid; padding-right: 10px; border-bottom: #0B2161 2px solid; pading-bottom: px; padding-top: 0px; margin: 10px 0px 5px; line-height: 30px;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;b&gt;1. ONNX Runtime 소개&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ONNX&amp;nbsp;Runtime은&amp;nbsp;하드웨어별&amp;nbsp;라이브러리를&amp;nbsp;통합할&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;유연한&amp;nbsp;인터페이스를&amp;nbsp;갖춘&amp;nbsp;크로스&amp;nbsp;플랫폼&amp;nbsp;머신러닝&amp;nbsp;모델&amp;nbsp;가속기입니다.&amp;nbsp;ONNX&amp;nbsp;Runtime은&amp;nbsp;PyTorch,&amp;nbsp;TensorFlow/Keras,&amp;nbsp;TFLite,&amp;nbsp;scikit-learn&amp;nbsp;및&amp;nbsp;기타&amp;nbsp;프레임워크의&amp;nbsp;모델과&amp;nbsp;함께&amp;nbsp;사용할&amp;nbsp;수&amp;nbsp;있습니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; 1.1&amp;nbsp; ONNX Runtime 추론&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ONNX&amp;nbsp;런타임&amp;nbsp;추론은&amp;nbsp;Office,&amp;nbsp;Azure,&amp;nbsp;Bing을&amp;nbsp;비롯한&amp;nbsp;주요&amp;nbsp;Microsoft&amp;nbsp;제품&amp;nbsp;및&amp;nbsp;서비스와&amp;nbsp;수십&amp;nbsp;개의&amp;nbsp;커뮤니티&amp;nbsp;프로젝트에서&amp;nbsp;머신&amp;nbsp;러닝&amp;nbsp;모델을&amp;nbsp;구동합니다.&lt;br /&gt;&lt;br /&gt;ONNX&amp;nbsp;런타임&amp;nbsp;추론의&amp;nbsp;사용&amp;nbsp;사례는&amp;nbsp;다음과&amp;nbsp;같습니다.&lt;br /&gt;&lt;br /&gt;다양한&amp;nbsp;머신&amp;nbsp;러닝&amp;nbsp;모델의&amp;nbsp;추론&amp;nbsp;성능&amp;nbsp;향상&lt;br /&gt;다양한&amp;nbsp;하드웨어&amp;nbsp;및&amp;nbsp;운영&amp;nbsp;체제에서&amp;nbsp;실행&lt;br /&gt;Python으로&amp;nbsp;학습하고&amp;nbsp;C#/C++/Java&amp;nbsp;앱에&amp;nbsp;배포&lt;br /&gt;다양한&amp;nbsp;프레임워크로&amp;nbsp;생성된&amp;nbsp;모델을&amp;nbsp;사용하여&amp;nbsp;학습&amp;nbsp;및&amp;nbsp;추론&amp;nbsp;수행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; 1.2 &amp;nbsp;작동 방식&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본&amp;nbsp;원리는&amp;nbsp;간단합니다.&lt;br /&gt;&lt;br /&gt;모델을&amp;nbsp;준비합니다.&amp;nbsp;이&amp;nbsp;모델은&amp;nbsp;ONNX&amp;nbsp;형식으로&amp;nbsp;내보내기/변환을&amp;nbsp;지원하는&amp;nbsp;모든&amp;nbsp;프레임워크에서&amp;nbsp;학습할&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;인기&amp;nbsp;있는&amp;nbsp;프레임워크/라이브러리에&amp;nbsp;대한&amp;nbsp;튜토리얼을&amp;nbsp;참조하세요.&lt;br /&gt;&lt;br /&gt;ONNX&amp;nbsp;런타임을&amp;nbsp;사용하여&amp;nbsp;모델을&amp;nbsp;로드하고&amp;nbsp;실행합니다.&amp;nbsp;다양한&amp;nbsp;언어로&amp;nbsp;작성된&amp;nbsp;모델을&amp;nbsp;실행하는&amp;nbsp;기본&amp;nbsp;튜토리얼을&amp;nbsp;참조하세요.&lt;br /&gt;&lt;br /&gt;(선택&amp;nbsp;사항)&amp;nbsp;다양한&amp;nbsp;런타임&amp;nbsp;구성&amp;nbsp;또는&amp;nbsp;하드웨어&amp;nbsp;가속기를&amp;nbsp;사용하여&amp;nbsp;성능을&amp;nbsp;최적화합니다.&amp;nbsp;다양한&amp;nbsp;옵션이&amp;nbsp;있으므로&amp;nbsp;성능&amp;nbsp;섹션을&amp;nbsp;참조하세요.&lt;br /&gt;&lt;br /&gt;3단계를&amp;nbsp;거치지&amp;nbsp;않더라도&amp;nbsp;ONNX&amp;nbsp;Runtime은&amp;nbsp;기존&amp;nbsp;프레임워크에&amp;nbsp;비해&amp;nbsp;성능&amp;nbsp;향상을&amp;nbsp;제공하는&amp;nbsp;경우가&amp;nbsp;많습니다.&lt;br /&gt;&lt;br /&gt;ONNX&amp;nbsp;Runtime은&amp;nbsp;모델&amp;nbsp;그래프에&amp;nbsp;여러&amp;nbsp;그래프&amp;nbsp;최적화를&amp;nbsp;적용한&amp;nbsp;후,&amp;nbsp;사용&amp;nbsp;가능한&amp;nbsp;하드웨어별&amp;nbsp;가속기를&amp;nbsp;기반으로&amp;nbsp;그래프를&amp;nbsp;서브그래프로&amp;nbsp;분할합니다.&amp;nbsp;ONNX&amp;nbsp;Runtime&amp;nbsp;코어의&amp;nbsp;최적화된&amp;nbsp;연산&amp;nbsp;커널은&amp;nbsp;성능&amp;nbsp;향상을&amp;nbsp;제공하며,&amp;nbsp;할당된&amp;nbsp;서브그래프는&amp;nbsp;각&amp;nbsp;실행&amp;nbsp;공급자(Execution&amp;nbsp;Provider)로부터&amp;nbsp;추가적인&amp;nbsp;가속을&amp;nbsp;받습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; 1.3 &amp;nbsp;모델 검증&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ONNX Runtime과 함께 사용하는 모든 모델은 정확성, 성능 및 사용 목적에의 적합성을 포함하여 테스트 및 검증을 거쳐야 합니다. ONNX Runtime은 모델이 ONNX 사양을 준수하는지 검증합니다. 그러나 불필요하게 많은 양의 메모리나 컴퓨팅 리소스를 소비하는 악의적인 모델을 구축할 수도 있습니다. 신뢰할 수 없는 출처에서 제공된 모델을 사용하는 경우, 프로덕션 환경에서 사용하기 전에 안전한 환경에서 모델을 검사하고 테스트하는 것이 좋습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;border-left: #0B2161 10px solid; padding-right: 10px; border-bottom: #0B2161 2px solid; pading-bottom: px; padding-top: 0px; margin: 10px 0px 5px; line-height: 30px;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;b&gt;2. ONNX 설치&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; 2.1 &amp;nbsp;Android에 설치&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JAVA/KOTLIN&lt;br /&gt;Android&amp;nbsp;Studio&amp;nbsp;프로젝트에서&amp;nbsp;다음&amp;nbsp;부분을&amp;nbsp;수정하세요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. build.gradle (Project):&lt;/p&gt;
&lt;div style=&quot;background-color: #263238; color: #eeffff; text-align: start;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&amp;nbsp; repositories &lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;{&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #82aaff;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; mavenCentral&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;()&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. build.gradle (Module):&lt;/p&gt;
&lt;div style=&quot;background-color: #263238; color: #eeffff; text-align: start;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&amp;nbsp; dependencies &lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;{&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; implementation &lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;'&lt;/span&gt;&lt;span style=&quot;color: #c3e88d;&quot;&gt;com.microsoft.onnxruntime:onnxruntime-android:latest.release&lt;/span&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;'&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #89ddff;&quot;&gt;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;C/C++&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MavenCentral에서 &lt;a style=&quot;color: #226aca;&quot; href=&quot;https://mvnrepository.com/artifact/com.microsoft.onnxruntime/onnxruntime-android&quot;&gt;onnxruntime-android&lt;/a&gt;&amp;nbsp;AAR 파일을 다운로드하고, 파일 확장자를 .aar에서 .zip으로 변경한 후 압축을 해제하세요. 헤더 폴더의 헤더 파일과 jni 폴더의 관련 libonnxruntime.so 동적 라이브러리를 NDK 프로젝트에 포함시키세요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;사용자&amp;nbsp;지정&amp;nbsp;빌드&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;a style=&quot;color: #226aca;&quot; href=&quot;https://onnxruntime.ai/docs/build/custom.html#android&quot;&gt;custom Android 패키지&lt;/a&gt;&amp;nbsp;생성 지침을 참조하세요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; 2.2 &amp;nbsp;On-Device Training용 설치&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;별도로&amp;nbsp;명시되지&amp;nbsp;않는&amp;nbsp;한,&amp;nbsp;이&amp;nbsp;섹션의&amp;nbsp;설치&amp;nbsp;지침은&amp;nbsp;온디바이스&amp;nbsp;학습을&amp;nbsp;수행하도록&amp;nbsp;설계된&amp;nbsp;사전&amp;nbsp;구축된&amp;nbsp;패키지를&amp;nbsp;기준으로&amp;nbsp;합니다.&lt;br /&gt;사전&amp;nbsp;구축된&amp;nbsp;학습&amp;nbsp;패키지가&amp;nbsp;모델을&amp;nbsp;지원하지만&amp;nbsp;크기가&amp;nbsp;너무&amp;nbsp;큰&amp;nbsp;경우, &lt;a style=&quot;color: #226aca;&quot; href=&quot;https://onnxruntime.ai/docs/build/custom.html&quot;&gt;custom training build&lt;/a&gt;를&amp;nbsp;생성할&amp;nbsp;수&amp;nbsp;있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #5c5962; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;오프라인 단계 : 학습 준비&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #263238; color: #eeffff; text-align: start;&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&amp;nbsp; python &lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;m pip install cerberus flatbuffers h5py numpy&lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;&amp;gt;=&lt;/span&gt;&lt;span style=&quot;color: #ff5370;&quot;&gt;1.16.6&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt; onnx packaging protobuf sympy setuptools&lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;&amp;gt;=&lt;/span&gt;&lt;span style=&quot;color: #ff5370;&quot;&gt;41.4.0&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&amp;nbsp; pip install &lt;/span&gt;&lt;span style=&quot;color: #c792ea;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;&lt;span style=&quot;color: #eeffff;&quot;&gt;i &lt;span style=&quot;color: #c3e88d; letter-spacing: 0px;&quot;&gt;mhttps://aiinfra.pkgs.visualstudio.com/PublicPackages/_packaging/ORT/pypi/simple/ onnxruntime-training-cpu&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;color: #5c5962; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #5c5962; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #5c5962; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;학습단계 - On-Device Training&lt;/b&gt;&lt;/p&gt;
&lt;div style=&quot;color: #5c5962; text-align: start;&quot;&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style13&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 9.767442%; text-align: center;&quot;&gt;&lt;b&gt;Device&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 11.511627%; text-align: center;&quot;&gt;&lt;b&gt;Language&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 16.627907%; text-align: center;&quot;&gt;&lt;b&gt;PackageName&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 62.093024%; text-align: center;&quot;&gt;&lt;b&gt;Installation Instructions&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #ffffff; width: 9.767442%; text-align: center;&quot;&gt;Windows&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff; width: 11.511627%; text-align: center;&quot;&gt;C, C++, C#&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff; width: 16.627907%;&quot;&gt;&lt;a style=&quot;color: #226aca;&quot; href=&quot;https://www.nuget.org/packages/Microsoft.ML.OnnxRuntime&quot;&gt;Microsoft.ML.OnnxRuntime.Training&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff; width: 62.093024%;&quot;&gt;dotnet add package Microsoft.ML.OnnxRuntime.Training&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #ffffff; width: 9.767442%; text-align: center;&quot;&gt;Linux&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff; width: 11.511627%; text-align: center;&quot;&gt;C, C++&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff; width: 16.627907%;&quot;&gt;&lt;a style=&quot;color: #226aca;&quot; href=&quot;https://github.com/microsoft/onnxruntime/releases&quot;&gt;onnxruntime-training-linux*.tgz&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff; width: 62.093024%;&quot;&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Download the&lt;span&gt;&amp;nbsp;&lt;/span&gt;*.tgz&lt;span&gt;&amp;nbsp;&lt;/span&gt;file from&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;color: #226aca;&quot; href=&quot;https://github.com/microsoft/onnxruntime/releases&quot;&gt;here&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Extract it.&lt;/li&gt;
&lt;li&gt;Move and include the header files in the&lt;span&gt;&amp;nbsp;&lt;/span&gt;include&lt;span&gt;&amp;nbsp;&lt;/span&gt;directory.&lt;/li&gt;
&lt;li&gt;Move the&lt;span&gt;&amp;nbsp;&lt;/span&gt;libonnxruntime.so&lt;span&gt;&amp;nbsp;&lt;/span&gt;dynamic library to a desired path and include it.&lt;/li&gt;
&lt;/ul&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #ffffff; width: 9.767442%; text-align: center;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff; width: 11.511627%; text-align: center;&quot;&gt;Python&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff; width: 16.627907%;&quot;&gt;&lt;a style=&quot;color: #226aca;&quot; href=&quot;https://pypi.org/project/onnxruntime-training/&quot;&gt;onnxruntime-training&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff; width: 62.093024%;&quot;&gt;pip install onnxruntime-training&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #ffffff; width: 9.767442%; text-align: center;&quot;&gt;Android&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff; width: 11.511627%; text-align: center;&quot;&gt;C, C++&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff; width: 16.627907%;&quot;&gt;&lt;a style=&quot;color: #226aca;&quot; href=&quot;https://mvnrepository.com/artifact/com.microsoft.onnxruntime/onnxruntime-training-android&quot;&gt;onnxruntime-training-android&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff; width: 62.093024%;&quot;&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Download the&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;color: #226aca;&quot; href=&quot;https://mvnrepository.com/artifact/com.microsoft.onnxruntime/onnxruntime-android&quot;&gt;onnxruntime-training-android (full package)&lt;/a&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;AAR hosted at Maven Central.&lt;/li&gt;
&lt;li&gt;Change the file extension from&lt;span&gt;&amp;nbsp;&lt;/span&gt;.aar&lt;span&gt;&amp;nbsp;&lt;/span&gt;to&lt;span&gt;&amp;nbsp;&lt;/span&gt;.zip, and unzip it.&lt;/li&gt;
&lt;li&gt;Include the header files from the&lt;span&gt;&amp;nbsp;&lt;/span&gt;headers&lt;span&gt;&amp;nbsp;&lt;/span&gt;folder.&lt;/li&gt;
&lt;li&gt;Include the relevant&lt;span&gt;&amp;nbsp;&lt;/span&gt;libonnxruntime.sodynamic library from the&lt;span&gt;&amp;nbsp;&lt;/span&gt;jni&lt;span&gt;&amp;nbsp;&lt;/span&gt;folder in your NDK project.&lt;/li&gt;
&lt;/ul&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #ffffff; width: 9.767442%; text-align: center;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff; width: 11.511627%; text-align: center;&quot;&gt;Java/Kotlin&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff; width: 16.627907%;&quot;&gt;&lt;a style=&quot;color: #226aca;&quot; href=&quot;https://mvnrepository.com/artifact/com.microsoft.onnxruntime/onnxruntime-android&quot;&gt;onnxruntime-training-android&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff; width: 62.093024%;&quot;&gt;In your Android Studio Project, make the following changes to:&lt;span&gt;&amp;nbsp;&lt;/span&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;build.gradle (Project):&lt;span&gt;&amp;nbsp;&lt;/span&gt;repositories { mavenCentral() }&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;build.gradle (Module):&lt;span&gt;&amp;nbsp;&lt;/span&gt;dependencies { implementation 'com.microsoft.onnxruntime:onnxruntime-training-android:latest.release' }&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #ffffff; width: 9.767442%; text-align: center;&quot;&gt;iOS&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff; width: 11.511627%; text-align: center;&quot;&gt;C, C++&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff; width: 16.627907%;&quot;&gt;&lt;b&gt;CocoaPods: onnxruntime-training-c&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff; width: 62.093024%;&quot;&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;In your CocoaPods&lt;span&gt;&amp;nbsp;&lt;/span&gt;Podfile, add the&lt;span&gt;&amp;nbsp;&lt;/span&gt;onnxruntime-training-c&lt;span&gt;&amp;nbsp;&lt;/span&gt;pod:&lt;/li&gt;
&lt;li&gt;Run&lt;span&gt;&amp;nbsp;&lt;/span&gt;pod install.&lt;/li&gt;
&lt;/ul&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #ffffff; width: 9.767442%; text-align: center;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff; width: 11.511627%; text-align: center;&quot;&gt;Objective-C&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff; width: 16.627907%;&quot;&gt;&lt;b&gt;CocoaPods: onnxruntime-training-objc&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff; width: 62.093024%;&quot;&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;In your CocoaPods&lt;span&gt;&amp;nbsp;&lt;/span&gt;Podfile, add the&lt;span&gt;&amp;nbsp;&lt;/span&gt;onnxruntime-training-objc&lt;span&gt;&amp;nbsp;&lt;/span&gt;pod:&lt;/li&gt;
&lt;li&gt;Run&lt;span&gt;&amp;nbsp;&lt;/span&gt;pod install.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #ffffff; width: 9.767442%; text-align: center;&quot;&gt;Web&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff; width: 11.511627%; text-align: center;&quot;&gt;JavaScript,&lt;br /&gt;TypeScript&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff; width: 16.627907%;&quot;&gt;&lt;b&gt;&lt;/b&gt;onnxruntime-web&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff; width: 62.093024%;&quot;&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Use either&lt;span&gt;&amp;nbsp;&lt;/span&gt;import * as ort from 'onnxruntime-web/training';&lt;span&gt;&amp;nbsp;&lt;/span&gt;or&lt;span&gt;&amp;nbsp;&lt;/span&gt;const ort = require('onnxruntime-web/training');&lt;/li&gt;
&lt;/ul&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;h2 id=&quot;large-model-training&quot; style=&quot;color: #27262b; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;385&quot; data-origin-height=&quot;131&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dwBOsm/dJMcagk0mTL/Iv56oUyVRXLvHb6paHeKd1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dwBOsm/dJMcagk0mTL/Iv56oUyVRXLvHb6paHeKd1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dwBOsm/dJMcagk0mTL/Iv56oUyVRXLvHb6paHeKd1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdwBOsm%2FdJMcagk0mTL%2FIv56oUyVRXLvHb6paHeKd1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;385&quot; height=&quot;131&quot; data-origin-width=&quot;385&quot; data-origin-height=&quot;131&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Project ES/: : ONNX</category>
      <author>Jay.P Morgan</author>
      <guid isPermaLink="true">https://eartist.tistory.com/1274</guid>
      <comments>https://eartist.tistory.com/1274#entry1274comment</comments>
      <pubDate>Tue, 28 Apr 2026 18:34:45 +0900</pubDate>
    </item>
    <item>
      <title>Brief Linux Kernel v7.0</title>
      <link>https://eartist.tistory.com/1273</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1700&quot; data-origin-height=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kR2T6/dJMcagFj3Ad/ZJldvcUM5397VJqXuP2500/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kR2T6/dJMcagFj3Ad/ZJldvcUM5397VJqXuP2500/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kR2T6/dJMcagFj3Ad/ZJldvcUM5397VJqXuP2500/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkR2T6%2FdJMcagFj3Ad%2FZJldvcUM5397VJqXuP2500%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1700&quot; height=&quot;1000&quot; data-origin-width=&quot;1700&quot; data-origin-height=&quot;1000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;border-left: #0B2161 10px solid; padding-right: 10px; border-bottom: #0B2161 2px solid; pading-bottom: px; padding-top: 0px; margin: 10px 0px 5px; line-height: 30px;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;b&gt;1. Brief &amp;nbsp;Linux Kernel v7.0&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존의 6.x 대 커널을 넘어&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b data-index-in-node=&quot;17&quot; data-path-to-node=&quot;0&quot;&gt;Linux Kernel v7.0&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;시대(2026년 기준)에 접어들면서, 리눅스는 단순히 운영체제의 커널을 넘어 초병렬화(Massive Parallelism)와&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b data-index-in-node=&quot;105&quot; data-path-to-node=&quot;0&quot;&gt;하드웨어 가속기와의 완전한 융합&lt;/b&gt;을 목표로 진화했습니다.&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-path-to-node=&quot;1&quot; data-ke-size=&quot;size16&quot;&gt;v4.19에서 v6.12를 거쳐 v7.0까지 오며 바뀐 핵심적인 변화들을 짚어드릴게요.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; 1. &amp;nbsp;스케줄러의 대변혁: EEVDF의 정착과 확장&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-path-to-node=&quot;1&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-path-to-node=&quot;4&quot; data-ke-size=&quot;size16&quot;&gt;과거의 CFS(Completely Fair Scheduler)는 v6.6 무근에서&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b data-index-in-node=&quot;83&quot; data-path-to-node=&quot;4&quot;&gt;EEVDF(Earliest Eligible Virtual Deadline First)&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;스케줄러로 완전히 교체되었습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000; text-align: start;&quot; data-path-to-node=&quot;5&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,0,0&quot;&gt;v7.0의 특징:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;EEVDF가 더욱 정교해져서, 이제는 CPU뿐만 아니라&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b data-index-in-node=&quot;41&quot; data-path-to-node=&quot;5,0,0&quot;&gt;NPU(신경망 처리 장치)와 GPU의 타임 슬라이스까지 커널 스케줄러가 직접 관리&lt;/b&gt;합니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,1,0&quot;&gt;구조적 변화:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;struct rq&lt;span&gt;&amp;nbsp;&lt;/span&gt;내에 단순히&lt;span&gt;&amp;nbsp;&lt;/span&gt;curr를 두는 것을 넘어, 이종 컴퓨팅 자원 간의 태스크 마이그레이션을 위한&lt;span&gt;&amp;nbsp;&lt;/span&gt;sched_group&lt;span&gt;&amp;nbsp;&lt;/span&gt;인터페이스가 대폭 강화되었습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; 2. &amp;nbsp;Rust-in-Linux의 완전한 주류화&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-path-to-node=&quot;8&quot; data-ke-size=&quot;size16&quot;&gt;4.19 시절에는 상상도 못 했던 변화입니다. v6.x 대에서 실험적으로 도입된&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b data-index-in-node=&quot;45&quot; data-path-to-node=&quot;8&quot;&gt;Rust 언어&lt;/b&gt;가 v7.0에 이르러서는 커널 핵심 서브시스템의 표준이 되었습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000; text-align: start;&quot; data-path-to-node=&quot;9&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,0,0&quot;&gt;메모리 안전성:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;드라이버뿐만 아니라 파일 시스템(NVMe, 비디오 드라이버 등)의 상당 부분이 Rust로 재작성되어, C언어 고유의 'Dangling Pointer'나 'Use-after-free'로 인한 커널 패닉이 극적으로 줄어들었습니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,1,0&quot;&gt;빌드 시스템:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Kbuild 시스템이 Rust와 C를 병렬로 완벽하게 처리하며, LLVM/Clang이 GCC와 대등한 수준의 기본 컴파일러로 자리 잡았습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; 3. &amp;nbsp;메모리 관리: MGLRU와 계층적 메모리&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-path-to-node=&quot;12&quot; data-ke-size=&quot;size16&quot;&gt;메모리 관리(MM) 측면에서는 MGLRU(Multi-Gen LRU)가 완전히 최적화되었습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000; text-align: start;&quot; data-path-to-node=&quot;13&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;13,0,0&quot;&gt;v7.0의 메모리:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;단순 RAM뿐만 아니라 CXL(Compute Express Link) 기반의 확장 메모리를 커널이 '계층형'으로 인식합니다.&lt;/li&gt;
&lt;li&gt;자주 쓰지 않는 데이터는 커널이 스스로 판단하여 저속 CXL 메모리로 보내고, 응답 속도가 중요한 데이터는 프로세서 근처의 HBM(High Bandwidth Memory)에 배치하는 알고리즘이&lt;span&gt;&amp;nbsp;&lt;/span&gt;struct page&lt;span&gt;&amp;nbsp;&lt;/span&gt;구조체 수준에서 통합되었습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; 4. &amp;nbsp;보안: 경계 없는 샌드박싱 (Landlock &amp;amp; eBPF)&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-path-to-node=&quot;16&quot; data-ke-size=&quot;size16&quot;&gt;커널 보안 모델이 &quot;전체를 막는 방식&quot;에서 &quot;태스크 단위의 미세 샌드박싱&quot;으로 바뀌었습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000; text-align: start;&quot; data-path-to-node=&quot;17&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;17,0,0&quot;&gt;eBPF의 진화:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;이제 eBPF는 단순한 모니터링 도구가 아니라, 커널 코드 수정 없이도 커널의 동작을 실시간으로 커스텀하는 '커널 내 가상 머신' 역할을 수행합니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;17,1,0&quot;&gt;Landlock:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;유저 레벨 어플리케이션이 스스로 접근 권한을 제한하는 Landlock LSM이 기본 활성화되어, 브라우저나 서버 프로세스가 뚫리더라도 시스템 전체로 전이되는 것을 원천 차단합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; 5. &amp;nbsp;실시간성(PREEMPT_RT)의 메인라인 통합 완료&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-path-to-node=&quot;20&quot; data-ke-size=&quot;size16&quot;&gt;오랜 숙원 사업이었던 실시간 패치(RT Patch)가 v7.0에 이르러서는 별도의 패치 없이도 커널 메인라인에 완전히 녹아들었습니다. 덕분에 일반 범용 리눅스 커널로도 산업용 로봇이나 정밀 제어 시스템을 운영할 수 있게 되었습니다.&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-path-to-node=&quot;20&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-path-to-node=&quot;21&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;요약하자면&lt;/b&gt;&lt;/p&gt;
&lt;div style=&quot;color: #000000; text-align: start;&quot;&gt;
&lt;div data-ved=&quot;0CAAQ3ecQahcKEwiz6Z78_YmUAxUAAAAAHQAAAAAQVA&quot; data-hveid=&quot;0&quot;&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-path-to-node=&quot;22&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style13&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;구분&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;v4.19 (과거)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;v7.0 (현재/미래)&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;22,1,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;22,1,0,0&quot;&gt;스케줄러&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;22,1,1,0&quot;&gt;CFS (Fairness 위주)&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;22,1,2,0&quot;&gt;EEVDF (Deadline &amp;amp; Latency 위주)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;22,2,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;22,2,0,0&quot;&gt;주요 언어&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;22,2,1,0&quot;&gt;Pure C&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;22,2,2,0&quot;&gt;C + Rust (Memory Safety)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;22,3,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;22,3,0,0&quot;&gt;메모리&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;22,3,1,0&quot;&gt;단순 RAM 관리&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;22,3,2,0&quot;&gt;CXL 기반 계층형 메모리 관리&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;22,4,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;22,4,0,0&quot;&gt;보안&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;22,4,1,0&quot;&gt;전통적인 권한 모델&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;22,4,2,0&quot;&gt;eBPF 기반의 미세 동적 보안&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-path-to-node=&quot;23&quot; data-ke-size=&quot;size16&quot;&gt;v4.19에서&lt;span&gt;&amp;nbsp;&lt;/span&gt;struct rq를 보시다가 v7.0 소스코드를 보시면, 파일 구조는 비슷해 보여도 그 내부를 흐르는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b data-index-in-node=&quot;65&quot; data-path-to-node=&quot;23&quot;&gt;자원 관리의 철학&lt;/b&gt;이 &quot;보안&quot;과 &quot;효율적 분산 처리&quot;로 완전히 옮겨갔음을 느끼실 수 있을 겁니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;border-left: #0B2161 10px solid; padding-right: 10px; border-bottom: #0B2161 2px solid; pading-bottom: px; padding-top: 0px; margin: 10px 0px 5px; line-height: 30px;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;b&gt;2. &amp;nbsp;리눅스&amp;nbsp;7.0&amp;nbsp;출시&amp;nbsp;예정:&amp;nbsp;차기&amp;nbsp;주요&amp;nbsp;커널&amp;nbsp;릴리스에서&amp;nbsp;기대할&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;사항&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;border-left: #D0D0D0 7px solid;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp; 2026. 02. 24&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.linuxjournal.com/content/linux-70-coming-what-expect-next-major-kernel-release&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.linuxjournal.com/content/linux-70-coming-what-expect-next-major-kernel-release&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리눅스&amp;nbsp;커널&amp;nbsp;프로젝트가&amp;nbsp;차기&amp;nbsp;주요&amp;nbsp;릴리스인&amp;nbsp;리눅스&amp;nbsp;커널&amp;nbsp;7.0을&amp;nbsp;향해&amp;nbsp;나아가면서&amp;nbsp;오픈소스&amp;nbsp;세계의&amp;nbsp;기대감이&amp;nbsp;고조되고&amp;nbsp;있습니다.&amp;nbsp;주요&amp;nbsp;버전&amp;nbsp;번호가&amp;nbsp;바뀐다는&amp;nbsp;것은&amp;nbsp;극적인&amp;nbsp;변화를&amp;nbsp;의미하는&amp;nbsp;것처럼&amp;nbsp;들릴&amp;nbsp;수&amp;nbsp;있지만,&amp;nbsp;실제로는&amp;nbsp;훨씬&amp;nbsp;더&amp;nbsp;꾸준한&amp;nbsp;발전이며,&amp;nbsp;바로&amp;nbsp;이러한&amp;nbsp;꾸준한&amp;nbsp;발전이&amp;nbsp;리눅스&amp;nbsp;커널을&amp;nbsp;그토록&amp;nbsp;안정적이고&amp;nbsp;신뢰할&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;운영체제로&amp;nbsp;만들어주는&amp;nbsp;요소입니다.&amp;nbsp;리눅스&amp;nbsp;7.0의&amp;nbsp;첫&amp;nbsp;번째&amp;nbsp;릴리스&amp;nbsp;후보(RC1)가&amp;nbsp;이미&amp;nbsp;공개되었으며,&amp;nbsp;개발자들은&amp;nbsp;2026년&amp;nbsp;4월&amp;nbsp;중순경으로&amp;nbsp;예상되는&amp;nbsp;안정&amp;nbsp;버전&amp;nbsp;출시를&amp;nbsp;위한&amp;nbsp;마지막&amp;nbsp;단계에&amp;nbsp;접어들었습니다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;혁명이&amp;nbsp;아닌&amp;nbsp;진화&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리눅스&amp;nbsp;커널의&amp;nbsp;창시자이자&amp;nbsp;주요&amp;nbsp;관리자인&amp;nbsp;리누스&amp;nbsp;토르발스는&amp;nbsp;리눅스&amp;nbsp;6.19&amp;nbsp;이후의&amp;nbsp;차기&amp;nbsp;버전이&amp;nbsp;리눅스&amp;nbsp;7.0으로&amp;nbsp;명명될&amp;nbsp;것이라고&amp;nbsp;공식적으로&amp;nbsp;발표했습니다.&amp;nbsp;그는&amp;nbsp;발표에서&amp;nbsp;&quot;7.0&quot;으로의&amp;nbsp;도약이&amp;nbsp;엄청난&amp;nbsp;아키텍처적&amp;nbsp;변화를&amp;nbsp;의미하는&amp;nbsp;것이&amp;nbsp;아니라,&amp;nbsp;버전&amp;nbsp;번호를&amp;nbsp;관리하기&amp;nbsp;쉽게&amp;nbsp;하기&amp;nbsp;위한&amp;nbsp;실용적인&amp;nbsp;명명&amp;nbsp;결정이라고&amp;nbsp;밝혔습니다.&lt;br /&gt;&lt;br /&gt;이러한&amp;nbsp;전통은&amp;nbsp;오랜&amp;nbsp;패턴을&amp;nbsp;이어가고&amp;nbsp;있습니다.&amp;nbsp;커널&amp;nbsp;시리즈는&amp;nbsp;일반적으로&amp;nbsp;마이너&amp;nbsp;버전(예:&amp;nbsp;6.19)이&amp;nbsp;높아질&amp;nbsp;때까지&amp;nbsp;번호가&amp;nbsp;매겨지고,&amp;nbsp;그&amp;nbsp;이후에는&amp;nbsp;변경&amp;nbsp;사항이&amp;nbsp;기존&amp;nbsp;기능을&amp;nbsp;깨뜨리는&amp;nbsp;것이&amp;nbsp;아니라&amp;nbsp;점진적이고&amp;nbsp;대부분&amp;nbsp;추가적인&amp;nbsp;방식이더라도&amp;nbsp;메이저&amp;nbsp;버전&amp;nbsp;번호가&amp;nbsp;증가합니다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;리눅스&amp;nbsp;7.0&amp;nbsp;개발&amp;nbsp;주기&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리눅스&amp;nbsp;7.0&amp;nbsp;개발&amp;nbsp;주기는&amp;nbsp;전&amp;nbsp;세계&amp;nbsp;기여자들의&amp;nbsp;새로운&amp;nbsp;코드를&amp;nbsp;수용하는&amp;nbsp;병합&amp;nbsp;기간으로&amp;nbsp;시작되었습니다.&amp;nbsp;현재&amp;nbsp;릴리스&amp;nbsp;후보&amp;nbsp;단계가&amp;nbsp;진행&amp;nbsp;중이며,&amp;nbsp;안정화&amp;nbsp;및&amp;nbsp;테스트에&amp;nbsp;초점이&amp;nbsp;맞춰지고&amp;nbsp;있습니다.&lt;br /&gt;&lt;br /&gt;7.0-rc1&amp;nbsp;발표에서는&amp;nbsp;이번&amp;nbsp;주기에서&amp;nbsp;병합&amp;nbsp;기간이&amp;nbsp;&quot;순조롭게&quot;&amp;nbsp;진행되었으며,&amp;nbsp;리드&amp;nbsp;개발자의&amp;nbsp;테스트&amp;nbsp;머신에서&amp;nbsp;주요&amp;nbsp;부팅&amp;nbsp;오류가&amp;nbsp;비교적&amp;nbsp;적게&amp;nbsp;보고되었다고&amp;nbsp;언급했습니다.&amp;nbsp;이는&amp;nbsp;커널의&amp;nbsp;광범위한&amp;nbsp;하드웨어&amp;nbsp;지원을&amp;nbsp;보여주는&amp;nbsp;좋은&amp;nbsp;징조입니다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;예상되는&amp;nbsp;개선&amp;nbsp;사항&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;안정화된&amp;nbsp;7.0&amp;nbsp;커널의&amp;nbsp;최종&amp;nbsp;변경&amp;nbsp;사항은&amp;nbsp;출시될&amp;nbsp;때&amp;nbsp;공개되겠지만,&amp;nbsp;초기&amp;nbsp;미리&amp;nbsp;보기&amp;nbsp;및&amp;nbsp;보고를&amp;nbsp;통해&amp;nbsp;다음과&amp;nbsp;같은&amp;nbsp;몇&amp;nbsp;가지&amp;nbsp;주요&amp;nbsp;특징이&amp;nbsp;두드러집니다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1.&amp;nbsp;광범위한&amp;nbsp;하드웨어&amp;nbsp;지원&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재까지&amp;nbsp;변경&amp;nbsp;사항의&amp;nbsp;상당&amp;nbsp;부분은&amp;nbsp;드라이버&amp;nbsp;업데이트로,&amp;nbsp;Linux가&amp;nbsp;Intel,&amp;nbsp;AMD,&amp;nbsp;Qualcomm과&amp;nbsp;같은&amp;nbsp;벤더의&amp;nbsp;최신&amp;nbsp;CPU&amp;nbsp;및&amp;nbsp;SoC를&amp;nbsp;지원하도록&amp;nbsp;합니다.&amp;nbsp;초기&amp;nbsp;테스트&amp;nbsp;결과&amp;nbsp;Intel&amp;nbsp;Nova&amp;nbsp;Lake&amp;nbsp;및&amp;nbsp;AMD&amp;nbsp;Zen&amp;nbsp;6와&amp;nbsp;같은&amp;nbsp;새로운&amp;nbsp;제품군에&amp;nbsp;대한&amp;nbsp;지원이&amp;nbsp;확인되었으며,&amp;nbsp;이는&amp;nbsp;차세대&amp;nbsp;노트북,&amp;nbsp;데스크톱&amp;nbsp;및&amp;nbsp;서버에&amp;nbsp;중요한&amp;nbsp;역할을&amp;nbsp;할&amp;nbsp;것입니다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2.&amp;nbsp;성능&amp;nbsp;및&amp;nbsp;응답성&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;커널&amp;nbsp;관리자와&amp;nbsp;커뮤니티&amp;nbsp;보고에&amp;nbsp;따르면&amp;nbsp;성능&amp;nbsp;향상이&amp;nbsp;7.0&amp;nbsp;버전의&amp;nbsp;주요&amp;nbsp;특징&amp;nbsp;중&amp;nbsp;하나입니다.&amp;nbsp;구체적인&amp;nbsp;내용은&amp;nbsp;아직&amp;nbsp;밝혀지지&amp;nbsp;않았지만,&amp;nbsp;커널의&amp;nbsp;스케줄러&amp;nbsp;및&amp;nbsp;메모리&amp;nbsp;관리&amp;nbsp;하위&amp;nbsp;시스템은&amp;nbsp;워크로드가&amp;nbsp;다양해짐에&amp;nbsp;따라&amp;nbsp;지속적으로&amp;nbsp;최적화되는&amp;nbsp;경향이&amp;nbsp;있습니다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3.&amp;nbsp;파일&amp;nbsp;시스템&amp;nbsp;및&amp;nbsp;하위&amp;nbsp;시스템&amp;nbsp;개선&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내부적으로&amp;nbsp;파일&amp;nbsp;시스템,&amp;nbsp;네트워킹&amp;nbsp;및&amp;nbsp;코어&amp;nbsp;라이브러리와&amp;nbsp;같은&amp;nbsp;기본&amp;nbsp;구성&amp;nbsp;요소가&amp;nbsp;안정성과&amp;nbsp;효율성&amp;nbsp;향상을&amp;nbsp;위해&amp;nbsp;개선되고&amp;nbsp;있습니다.&amp;nbsp;이러한&amp;nbsp;변화들이&amp;nbsp;헤드라인을&amp;nbsp;장식하는&amp;nbsp;주요&amp;nbsp;기능으로&amp;nbsp;보이지는&amp;nbsp;않지만,&amp;nbsp;대용량&amp;nbsp;스토리지&amp;nbsp;어레이부터&amp;nbsp;고속&amp;nbsp;네트워킹에&amp;nbsp;이르기까지&amp;nbsp;Linux의&amp;nbsp;처리&amp;nbsp;성능에&amp;nbsp;큰&amp;nbsp;영향을&amp;nbsp;미칩니다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;버전&amp;nbsp;번호의&amp;nbsp;진정한&amp;nbsp;의미&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Linux&amp;nbsp;7.0에서&amp;nbsp;가장&amp;nbsp;많이&amp;nbsp;논의되는&amp;nbsp;부분&amp;nbsp;중&amp;nbsp;하나는&amp;nbsp;기술적인&amp;nbsp;측면이&amp;nbsp;아니라&amp;nbsp;바로&amp;nbsp;버전&amp;nbsp;번호&amp;nbsp;자체입니다.&amp;nbsp;토르발스는&amp;nbsp;주요&amp;nbsp;버전&amp;nbsp;번호가&amp;nbsp;과거와&amp;nbsp;극적인&amp;nbsp;단절을&amp;nbsp;의미하는&amp;nbsp;것이&amp;nbsp;아니라,&amp;nbsp;버전&amp;nbsp;관리의&amp;nbsp;단순성과&amp;nbsp;명확성을&amp;nbsp;위한&amp;nbsp;것이라고&amp;nbsp;여러&amp;nbsp;차례&amp;nbsp;설명했습니다.&amp;nbsp;그의&amp;nbsp;말에&amp;nbsp;따르면,&amp;nbsp;이러한&amp;nbsp;변화는&amp;nbsp;단순히&amp;nbsp;하위&amp;nbsp;버전&amp;nbsp;번호를&amp;nbsp;관리하는&amp;nbsp;번거로움을&amp;nbsp;피하고&amp;nbsp;개발&amp;nbsp;과정을&amp;nbsp;명확하게&amp;nbsp;보여주기&amp;nbsp;위한&amp;nbsp;것이기도&amp;nbsp;합니다.&lt;br /&gt;&lt;br /&gt;이는&amp;nbsp;중요한&amp;nbsp;사실을&amp;nbsp;시사합니다.&amp;nbsp;Linux의&amp;nbsp;버전&amp;nbsp;관리는&amp;nbsp;마케팅이나&amp;nbsp;제품&amp;nbsp;출시&amp;nbsp;주기에&amp;nbsp;따라&amp;nbsp;좌우되지&amp;nbsp;않습니다.&amp;nbsp;대규모&amp;nbsp;기능&amp;nbsp;추가를&amp;nbsp;알리기&amp;nbsp;위해&amp;nbsp;버전&amp;nbsp;업데이트를&amp;nbsp;사용하는&amp;nbsp;상용&amp;nbsp;소프트웨어와&amp;nbsp;달리,&amp;nbsp;Linux의&amp;nbsp;버전&amp;nbsp;번호는&amp;nbsp;실용적이며&amp;nbsp;개발&amp;nbsp;프로세스에&amp;nbsp;특화되어&amp;nbsp;있습니다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;안정화&amp;nbsp;버전은&amp;nbsp;언제&amp;nbsp;출시될까요?&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RC1이&amp;nbsp;이미&amp;nbsp;출시된&amp;nbsp;Linux&amp;nbsp;7.0의&amp;nbsp;안정&amp;nbsp;버전은&amp;nbsp;기존의&amp;nbsp;주간&amp;nbsp;릴리스&amp;nbsp;후보(RC1)&amp;nbsp;출시&amp;nbsp;주기&amp;nbsp;이후에&amp;nbsp;출시될&amp;nbsp;것으로&amp;nbsp;예상됩니다.&amp;nbsp;과거&amp;nbsp;패턴을&amp;nbsp;기반으로&amp;nbsp;하고,&amp;nbsp;중대한&amp;nbsp;퇴보가&amp;nbsp;없다고&amp;nbsp;가정할&amp;nbsp;때,&amp;nbsp;최종&amp;nbsp;릴리스는&amp;nbsp;약&amp;nbsp;7번의&amp;nbsp;RC&amp;nbsp;빌드&amp;nbsp;이후인&amp;nbsp;2026년&amp;nbsp;4월&amp;nbsp;중순경으로&amp;nbsp;예상됩니다.&lt;br /&gt;&lt;br /&gt;안정화되면&amp;nbsp;Linux&amp;nbsp;7.0은&amp;nbsp;차세대&amp;nbsp;Ubuntu&amp;nbsp;LTS,&amp;nbsp;Fedora&amp;nbsp;및&amp;nbsp;최신&amp;nbsp;커널&amp;nbsp;기능을&amp;nbsp;우선적으로&amp;nbsp;제공하는&amp;nbsp;주요&amp;nbsp;배포판을&amp;nbsp;포함한&amp;nbsp;후속&amp;nbsp;릴리스&amp;nbsp;주기에서&amp;nbsp;채택될&amp;nbsp;것으로&amp;nbsp;예상됩니다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;사용자에게&amp;nbsp;중요한&amp;nbsp;이유&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대부분의&amp;nbsp;일반&amp;nbsp;사용자,&amp;nbsp;특히&amp;nbsp;데스크톱&amp;nbsp;및&amp;nbsp;노트북&amp;nbsp;사용자에게&amp;nbsp;커널&amp;nbsp;변경&amp;nbsp;사항은&amp;nbsp;눈에&amp;nbsp;띄지&amp;nbsp;않게&amp;nbsp;작동합니다.&amp;nbsp;화려한&amp;nbsp;새&amp;nbsp;데스크톱&amp;nbsp;기능을&amp;nbsp;보지&amp;nbsp;못할&amp;nbsp;수도&amp;nbsp;있지만,&amp;nbsp;시간이&amp;nbsp;지남에&amp;nbsp;따라&amp;nbsp;다음과&amp;nbsp;같은&amp;nbsp;변화를&amp;nbsp;체감할&amp;nbsp;수&amp;nbsp;있습니다.&lt;br /&gt;&lt;br /&gt;새로운&amp;nbsp;프로세서&amp;nbsp;및&amp;nbsp;주변&amp;nbsp;장치에&amp;nbsp;대한&amp;nbsp;향상된&amp;nbsp;지원&lt;br /&gt;고부하&amp;nbsp;작업&amp;nbsp;시&amp;nbsp;성능&amp;nbsp;향상&lt;br /&gt;저장&amp;nbsp;장치,&amp;nbsp;메모리&amp;nbsp;및&amp;nbsp;전원&amp;nbsp;관리의&amp;nbsp;원활함&lt;br /&gt;새로운&amp;nbsp;커널&amp;nbsp;트리에&amp;nbsp;포함된&amp;nbsp;보안&amp;nbsp;및&amp;nbsp;안정성&amp;nbsp;수정&amp;nbsp;사항&lt;br /&gt;즉,&amp;nbsp;Linux&amp;nbsp;7.0은&amp;nbsp;혁명적인&amp;nbsp;변화가&amp;nbsp;아니라&amp;nbsp;차세대&amp;nbsp;하드웨어&amp;nbsp;및&amp;nbsp;소프트웨어&amp;nbsp;요구&amp;nbsp;사항에&amp;nbsp;대비한&amp;nbsp;개선&amp;nbsp;및&amp;nbsp;준비입니다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;결론&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리눅스&amp;nbsp;7.0으로의&amp;nbsp;업그레이드가&amp;nbsp;단순히&amp;nbsp;숫자로만&amp;nbsp;주목받는&amp;nbsp;것은&amp;nbsp;아니지만,&amp;nbsp;그&amp;nbsp;이면에는&amp;nbsp;리눅스&amp;nbsp;커널의&amp;nbsp;꾸준한&amp;nbsp;진화의&amp;nbsp;연장선상에&amp;nbsp;있는&amp;nbsp;미묘한&amp;nbsp;의미가&amp;nbsp;담겨&amp;nbsp;있습니다.&amp;nbsp;광범위한&amp;nbsp;하드웨어&amp;nbsp;지원,&amp;nbsp;지속적인&amp;nbsp;성능&amp;nbsp;개선&amp;nbsp;작업,&amp;nbsp;그리고&amp;nbsp;안정성을&amp;nbsp;최우선으로&amp;nbsp;고려한&amp;nbsp;개발&amp;nbsp;프로세스를&amp;nbsp;통해&amp;nbsp;2026년&amp;nbsp;출시될&amp;nbsp;리눅스&amp;nbsp;7.0은&amp;nbsp;커널을&amp;nbsp;최신&amp;nbsp;상태로&amp;nbsp;유지하고,&amp;nbsp;강력한&amp;nbsp;성능을&amp;nbsp;제공하며,&amp;nbsp;일상적인&amp;nbsp;사용에&amp;nbsp;항상&amp;nbsp;대비할&amp;nbsp;수&amp;nbsp;있도록&amp;nbsp;할&amp;nbsp;것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Embedded : : Linux/: : Kernel dev</category>
      <author>Jay.P Morgan</author>
      <guid isPermaLink="true">https://eartist.tistory.com/1273</guid>
      <comments>https://eartist.tistory.com/1273#entry1273comment</comments>
      <pubDate>Sun, 26 Apr 2026 07:25:53 +0900</pubDate>
    </item>
  </channel>
</rss>