Copyright (C) 커널연구회 (www.kernel.bz)작성자: 정재준(rgbi3307 골뱅이 nate.com)문서위치 메인(출처): https://www.kernel.bz/blogPost/kernel-ml아래 내용은 누구나 사용할 수 있습니다. 저자정보는 지우지 말고 위의 출처를 기입해 주시기 바랍니다.커널 버전 [v6.19)안녕하세요?최근에 리눅스 커널 엔지니어들이 커널 소스에 머신러닝을 적용하려는 움직임이 나타나고 있습니다.이것과 관련하여 커널 메일링 리스트(lore.kernel.org)에 의견 표출되고 있는 내용을 번역 정리하여 공유 합니다. 그림참조: https://linuxiac.com/new-proposal-explores-machine-learning-assistance-for-linux-kernel-behavior/ 리눅스 커널 메일링 리스트 참조:https://lore.kernel.org/linux-fsdevel/20240605110219.7356-1-slava@dubeyko.com/From: Viacheslav Dubeyko <slava@dubeyko.com> 머신러닝 워크로드와 사용자 공간 드라이버를 위한 통합 인프라에 대한 논의를 시작하고 싶습니다. 문제 진술지난 몇 년간 두 가지 중요한 추세가 나타났습니다.(1) 커널 공간 기능을 사용자 공간 드라이버로 이동시키는 추세(예: SPDK, DPDK, ublk);(2) 다양한 실제 응용 프로그램에 머신러닝 모델을 활용하려는 상당한 노력(예: 커널 매개변수 튜닝, 저장 장치 오류 예측, 드라이브 오류 감지 등). 이 두 추세는 리눅스 커널의 발전에 매우 중요한 의미를 지닙니다. 사용자 공간 드라이버는 지연 시간을 줄이고 연산 성능을 향상시키는 방법입니다. 하지만 리눅스 커널을 우회하는 접근 방식은 보안 및 효율성 위험, 사용자 공간 스레드의 동기화 문제 발생 가능성, 리눅스 커널 아키텍처의 패러다임 파괴 등의 문제를 야기할 수 있습니다. 일반적으로 리눅스 커널에서 부동 소수점 연산을 사실상 사용할 수 없고, 머신러닝 알고리즘(특히 학습 단계)이 많은 연산 능력을 요구하기 때문에 리눅스 커널 공간에 머신러닝 기법을 직접 구현하는 것은 매우 어렵고 비효율적이며 문제가 많습니다. 리눅스 커널은 머신러닝 접근 방식과 사용자 공간 드라이버 모두에 대한 인프라를 도입하고 통합해야 한다고 말할 수 있습니다. 리눅스 커널에 머신러닝이 필요한 이유는 무엇일까요?리눅스 커널에 머신러닝(ML) 인프라가 정말 필요할까요?우선, 리눅스 커널 작업 중 일상적인 작업을 자동화하는데 ML 알고리즘을 활용할 수 있는 실용적인 사례를 쉽게 떠올릴 수 있습니다. 더 나아가, ML 서브시스템은 실행 중인 모든 리눅스 커널에 대한 자동화된 연구 및 통계 수집에도 사용될 수 있습니다. 또한, ML 서브시스템은 문서 작성, 실시간 커널 매개변수 튜닝, 커널 재컴파일, 심지어 버그 및 크래시 자동 보고까지 수행할 수 있습니다. 일반적으로 말해서, ML 서브시스템은 리눅스 커널의 기능을 확장할 수 있는 잠재력을 가지고 있습니다.핵심 질문은 "어떻게?"입니다. 잠재적 인프라 비전엄밀히 말하면, 사용자 공간 드라이버와 ML 서브시스템 모두 리눅스 커널 기능의 사용자 공간 확장으로 간주될 수 있는 사용자 공간 기능을 필요로 합니다. 이러한 접근 방식은 커널 측의 기능은 최소화하고 사용자 공간 측의 주요 기능을 유지하며, 커널 공간과 사용자 공간 간의 컨텍스트 스위칭 횟수를 최소화한다는 점에서 마이크로커널 아키텍처와 유사합니다. 커널 측 에이전트(또는 서브시스템)의 핵심 역할은 사용자 공간 확장 기능을 관리하고, 커널 측의 공유 리소스 또는 메타데이터에 대한 접근을 동기화하며, 통계를 수집하여 sysfs 또는 특수 로그 파일(syslog와 유사)을 통해 공유하는 것입니다. 예를 들어, 이러한 특수 로그 파일은 ML 사용자 공간 확장 프로그램에서 ML 알고리즘을 실행하고 데이터 및 사용 가능한 통계를 분석하는 데 사용될 수 있습니다. 일반적으로 주요 ML 로직은 사용자 공간 측의 확장 프로그램에서 실행될 수 있습니다. 이 ML 로직은 예를 들어 커널 측의 ML 에이전트와 공유할 수 있는 "권장 사항"을 생성할 수 있습니다. 결과적으로 커널 공간 ML 에이전트는 공유된 "권장 사항"을 확인하고 Linux 커널 튜닝, 재컴파일, "핫" 재시작 등을 통해 유효한 "권장 사항"을 적용할 수 있습니다. 기술적으로 말하면, 사용자 공간 드라이버는 단순한 커널 공간 에이전트/하위 시스템 및 사용자 공간 확장 프로그램과 거의 동일한 아키텍처를 필요로 합니다. 주요 기능은 사용자 공간 측에 있으며, 커널 공간 측은 사용자 공간 확장 프로그램 관리, 필요한 리소스 할당, 공유 리소스에 대한 액세스 동기화, 통계 수집만 담당합니다. 일반적으로 이러한 접근 방식은 다음과 같은 필요성을 내포합니다.머신러닝 에이전트 또는 사용자 공간 드라이버를 커널 측에서 나타낼 수 있는 특수 드라이버 클래스를 등록해야 합니다. 그런 다음, modprobe와 유사한 모델을 사용하여 머신러닝 에이전트 또는 사용자 공간 드라이버의 인스턴스를 생성할 수 있습니다. 최종적으로, 사용자 공간 확장 기능에 연결된 커널 공간 에이전트가 생성됩니다.여기서 핵심은 사용자 공간 확장 기능이 하드웨어 장치와 직접 통신할 수 있지만, 커널 측에서는 사용자 공간 확장 기능의 활동을 관리하고 리소스를 할당할 수 있다는 것입니다. 사용자 공간 확장 기능의 로직에 따라 특화된 커널 측 에이전트의 통합 아키텍처를 제안할 수 있습니다. 단, 커널 공간 에이전트의 로직은 가능한 한 최소화되고 단순하며 통합되어야 합니다. 기술적으로 말하면, 커널 공간 에이전트의 로직은 다음과 같이 정의될 수 있습니다. eBPF 프로그램과 eBPF 아레나(또는 커널 공간과 사용자 공간 간의 공유 메모리)는 커널 공간 에이전트와 사용자 공간 확장 기능 간의 상호 작용에 사용될 수 있습니다. 그리고 이러한 상호 작용은 제출 및 완료 큐 등을 통해 구현될 수 있습니다. 요약하자면, 설명된 아키텍처는 리눅스 커널에 머신러닝 인프라를 구현하고 사용자 공간 드라이버를 통합할 수 있습니다.이에 대한 의견이 있으신가요? 이러한 비전이 얼마나 실현 가능할까요? 리눅스 커널 메일링 리스트 참조:https://lore.kernel.org/linux-mm/87343deawn.fsf@trenco.lwn.net/T/#tFrom: Viacheslav Dubeyko <slava@dubeyko.com>Machine Learning (ML) library in Linux kernel 이 패치셋은 리눅스 커널용 머신 러닝(ML) 라이브러리의 초기 구상을 소개합니다.이는 ML 라이브러리 API를 정의하고 리눅스 커널에서 ML 모델을 실행하는 방법을 구체화하기 위한 노력입니다. 리눅스 커널은 방대한 코드베이스와 엄청난 수의 서브시스템 및 다양한 구성 옵션을 가지고 있습니다. 현대 워크로드의 복잡성과 변화하는 특성으로 인해 효율적인 리눅스 커널 구성 및 실행 상태를 설계하는 것 또한 복잡합니다. 머신러닝(ML)은 개발자가 알고리즘을 직접 구현하지 않고도 데이터를 학습하고, 패턴을 찾고, 예측하는 접근 방식/분야입니다. ML 응용 분야는 나날이 증가하고 있습니다. 일반적으로 ML은 Linux 커널에 자체 진화 및 자체 학습 기능을 도입할 수 있습니다. 이미 Linux 커널의 구성 및 최적화를 위해 ML 접근 방식을 적용하려는 연구 및 업계의 노력이 진행되고 있습니다. 하지만 Linux 커널에 ML 접근 방식을 도입하는 것은 간단하고 쉬운 일이 아닙니다. 이 과정에는 여러 가지 문제점과 해결되지 않은 질문들이 존재합니다. 우선, 모든 ML 모델은 실행을 위해 부동 소수점 연산(FPU)을 필요로 합니다. 하지만 커널 공간에서는 FPU를 직접 사용할 수 없습니다. 또한, ML 모델은 학습 단계를 거쳐야 하는데, 이 과정에서 Linux 커널의 성능이 크게 저하될 수 있습니다. 추론 단계 역시 커널 성능 측면에서 문제가 될 수 있습니다. 따라서 Linux 커널에 ML 접근 방식을 도입하는 것은 필수적인 단계입니다. 그렇다면 리눅스 커널에서 머신러닝(ML) 접근 방식을 어떻게 활용할 수 있을까요?리눅스 커널에 ML 모델을 도입하려면 어떤 인프라가 필요할까요?리눅스 커널에서 머신러닝(ML) 모델을 사용하는 목표는 무엇인가요? 주요 목표는 처리된 데이터를 기반으로 특정 리눅스 커널 서브시스템의 로직을 정교하게 설계하거나, 서브시스템의 내부 상태를 기반으로 효율적인 서브시스템 구성을 제안하기 위해 ML 모델을 활용하는 것입니다. 이를 위해서는 다음과 같은 단계가 필요합니다.(1) 학습 데이터 수집,(2) ML 모델 학습 단계 실행,(3) 학습된 ML 모델 테스트,(4) ML 모델을 사용한 추론 단계 실행. ML 모델의 추론 결과는 리눅스 커널 서브시스템 구성을 권장하거나, 합성된 서브시스템 로직(예: eBPF 로직)을 커널 공간에 삽입하는 데 사용될 수 있습니다. 리눅스 커널에서 머신러닝(ML) 인프라를 어떻게 설계할 수 있을까요? 사용자 공간의 ML 모델 스레드와 커널 서브시스템 간의 상호작용을 위한 일반화된 인터페이스를 구현할 수 있는 특수한 ML 라이브러리를 리눅스 커널에 도입해야 합니다. 또한, 이 인터페이스는 다음과 같은 기능을 포함해야 합니다.(1) 커널 서브시스템에서 ML 모델 프록시 생성/초기화/삭제,(2) ML 모델 프록시 시작/중지,(3) 커널 공간에서 데이터 세트 가져오기/전처리/게시,(4) 사용자 공간에서 ML 모델 권장 사항 수신/전처리/적용,(5) 커널 공간에서 합성된 로직/권장 사항 실행,(6) 합성된 로직/권장 사항의 효율성 평가,(7) 사용자 공간 측의 ML 모델 오류를 수정하기 위한 오류 역전파 실행. 생성 및 초기화 로직은 모듈 로드 또는 Linux 커널 시작 시 커널 서브시스템에서 실행될 수 있습니다(반대로 모듈 언로드 또는 커널 종료 시 ML 모델 프록시의 소멸 로직이 실행됩니다). 사용자 공간의 ML 모델 스레드는 커널 측에서 ML 모델 프록시를 재초기화하고 시작/정지 로직을 실행할 수 있습니다. 먼저, ML 모델은 커널 공간의 데이터를 사용하여 학습되어야 합니다. 데이터는 사용자 공간의 ML 모델에서 요청하거나 ML 모델 프록시가 커널 공간에서 게시할 수 있습니다. sysfs 인터페이스를 사용하여 이러한 상호 작용을 조정할 수 있습니다. 결과적으로, 사용자 공간의 ML 모델은 sysfs, FUSE 또는 문자 장치를 통해 커널 공간에서 데이터 세트를 추출할 수 있어야 합니다. 추출된 데이터는 영구 저장소에 저장될 수 있으며, 최종적으로 ML 모델은 사용자 공간에서 이러한 데이터에 접근하여 학습될 수 있습니다. 훈련 단계에서도 지속적인 학습 모델을 적용할 수 있습니다. 이는 커널 서브시스템이 훈련 단계에서도 ML 모델의 권장 사항을 수신할 수 있음을 의미합니다. 커널 측의 ML 모델 프록시는 현재 커널 서브시스템의 상태를 추정하고, ML 모델 권장 사항을 적용해 보고, 적용된 권장 사항의 효율성을 평가할 수 있습니다. 일반적으로 커널 측의 ML 모델 프록시는 ML 모델 권장 사항과의 상호 작용에 대해 다음과 같은 몇 가지 모드를 고려할 수 있습니다.(1) 비상 모드,(2) 학습 모드,(3) 협업 모드,(4) 추천 모드. 비상 모드는 커널 서브시스템이 심각한 상태에 빠져 ML 모델 권장 사항을 활용할 수 없는 상황에서 최대한 효율적으로 작동해야 하는 모드입니다(예: ML 모델 권장 사항이 전혀 적합하지 않거나 부하가 매우 높은 경우). 학습 모드는 커널 서브시스템이 ML 모델의 성숙도를 평가하기 위해 일부 작업에 ML 모델 권장 사항을 적용해 보는 모드입니다. 또한, ML 모델 프록시는 ML 모델 추천이 비효율적이 될 경우 학습 상태로 모드를 전환할 수 있습니다. 협업 모드의 목표는 ML 모델의 성숙도를 달성하기 위해 전체 작업의 50%에서 ML 추천을 활용하는 것입니다. 마지막으로, ML 모델이 충분히 성숙하고 ML 추천 적용의 효율성이 사람이 만든 알고리즘보다 높으면 ML 모델 프록시는 커널 서브시스템을 추천 모드로 전환할 수 있습니다. 역전파 방식을 사용하여 커널에서 사용자 공간으로 효율성 추정 피드백을 공유함으로써 ML 모델을 수정할 수 있습니다. [REFERENCES][1] https://lore.kernel.org/linux-fsdevel/20240605110219.7356-1-slava@dubeyko.com/[2] https://www.youtube.com/watch?v=E7q0SKeniXU[3] https://github.com/kernel-ml-lib/ml-lib[4] https://github.com/kernel-ml-lib/ml-lib-linux 감사합니다.