eBPF 실전 (2) — BPF 맵과 링 버퍼: per-CPU, LRU, 유실, 맵 고정

eBPF 프로그램은 이벤트 하나를 처리하고 끝나는 짧은 함수라서, 이벤트 사이에 상태를 유지하거나 결과를 유저 공간에 넘기려면 BPF 맵이 필요하다. 문제는 맵 종류가 30가지가 넘고, 잘못 고르면 카운트가 조용히 유실되거나 이벤트가…

Continue ReadingeBPF 실전 (2) — BPF 맵과 링 버퍼: per-CPU, LRU, 유실, 맵 고정

eBPF 실전 (1) — libbpf와 CO-RE로 첫 커널 프로그램 작성하기

커널 동작을 들여다보려면 예전에는 커널 모듈을 만들거나 커널을 다시 빌드해야 했다. 모듈 버그 하나가 곧 커널 패닉이고, 커널 버전이 바뀔 때마다 다시 컴파일해야 한다. eBPF는 검증된 작은 프로그램을 실행 중인…

Continue ReadingeBPF 실전 (1) — libbpf와 CO-RE로 첫 커널 프로그램 작성하기

Ubuntu needrestart로 업데이트 후 재시작이 필요한 서비스와 커널 찾기

apt upgrade로 libc6나 openssl 보안 업데이트를 받았다고 해서 이미 떠 있는 데몬까지 패치되는 것은 아니다. 실행 중인 프로세스는 교체되기 전의 라이브러리를 메모리에 그대로 매핑하고 있어서, 재시작하기 전까지는 취약한 코드가 계속…

Continue ReadingUbuntu needrestart로 업데이트 후 재시작이 필요한 서비스와 커널 찾기

머신러닝 입문 (6) — 자동미분(autograd) 직접 만들기

5편에서는 은닉층 하나짜리 신경망의 기울기를 손으로 유도했는데, 활성함수를 바꾸거나 층을 하나 더 얹으면 유도를 처음부터 다시 해야 한다. 프레임워크는 이 일을 자동미분(automatic differentiation)으로 대신한다. 이 글에서는 스칼라 autograd 엔진을 100줄…

Continue Reading머신러닝 입문 (6) — 자동미분(autograd) 직접 만들기

머신러닝 입문 (5) — 역전파를 손으로 계산하고 코드로 검증하기

4편까지의 모델은 층이 하나라 기울기를 종이에 한 줄로 적을 수 있었지만, 층을 쌓으면 손실이 합성함수가 되어 기울기를 연쇄법칙으로 뒤에서 앞으로 전달해야 한다. 이것이 역전파(backpropagation)다. 이 글에서는 은닉층 하나짜리 신경망의 역전파를…

Continue Reading머신러닝 입문 (5) — 역전파를 손으로 계산하고 코드로 검증하기

머신러닝 입문 (4) — 로지스틱 회귀와 이진 분류

압축 저장소를 만든다면 압축률을 정확히 맞히기보다 "이 파일을 압축할 가치가 있는가"를 먼저 판정해야 하고, 잘못 판정하면 CPU를 헛쓰거나 저장 공간을 손해 본다. 이 글에서는 같은 데이터로 원본의 30% 미만으로 줄어드는가를…

Continue Reading머신러닝 입문 (4) — 로지스틱 회귀와 이진 분류

머신러닝 입문 (3) — 경사하강법과 학습률

2편의 정규방정식은 손실이 이차식일 때만 쓸 수 있고, 로지스틱 회귀나 신경망에는 그런 닫힌 해가 없다. 그래서 대부분의 학습은 기울기를 따라 조금씩 내려가는 경사하강법(gradient descent)으로 한다. 이 글에서는 같은 데이터로 경사하강을…

Continue Reading머신러닝 입문 (3) — 경사하강법과 학습률