<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://parameterfreak.com/feed.xml" rel="self" type="application/atom+xml" /><link href="https://parameterfreak.com/" rel="alternate" type="text/html" /><updated>2026-09-06T00:55:56+00:00</updated><id>https://parameterfreak.com/feed.xml</id><title type="html">parameterfreak</title><subtitle>온프레미스 AI 서빙 플랫폼 H-MAS를 만들고, 임베딩·이상탐지를 연구하고, 그 과정을 기록합니다. parameterfreak의 프로젝트와 블로그.</subtitle><author><name>{&quot;avatar&quot;=&gt;nil, &quot;name&quot;=&gt;nil, &quot;pronouns&quot;=&gt;nil, &quot;bio&quot;=&gt;nil, &quot;location&quot;=&gt;nil, &quot;employer&quot;=&gt;nil, &quot;uri&quot;=&gt;nil, &quot;email&quot;=&gt;&quot;contact@parameterfreak.com&quot;, &quot;academia&quot;=&gt;nil, &quot;arxiv&quot;=&gt;nil, &quot;googlescholar&quot;=&gt;nil, &quot;inspire-hep&quot;=&gt;nil, &quot;impactstory&quot;=&gt;nil, &quot;orcid&quot;=&gt;nil, &quot;semantic&quot;=&gt;nil, &quot;pubmed&quot;=&gt;nil, &quot;researchgate&quot;=&gt;nil, &quot;scopus&quot;=&gt;nil, &quot;bitbucket&quot;=&gt;nil, &quot;codepen&quot;=&gt;nil, &quot;dribbble&quot;=&gt;nil, &quot;github&quot;=&gt;nil, &quot;kaggle&quot;=&gt;nil, &quot;stackoverflow&quot;=&gt;nil, &quot;artstation&quot;=&gt;nil, &quot;bluesky&quot;=&gt;nil, &quot;facebook&quot;=&gt;nil, &quot;flickr&quot;=&gt;nil, &quot;foursquare&quot;=&gt;nil, &quot;goodreads&quot;=&gt;nil, &quot;google_plus&quot;=&gt;nil, &quot;keybase&quot;=&gt;nil, &quot;instagram&quot;=&gt;nil, &quot;lastfm&quot;=&gt;nil, &quot;linkedin&quot;=&gt;nil, &quot;mastodon&quot;=&gt;nil, &quot;medium&quot;=&gt;nil, &quot;pinterest&quot;=&gt;nil, &quot;soundcloud&quot;=&gt;nil, &quot;steam&quot;=&gt;nil, &quot;telegram&quot;=&gt;nil, &quot;tumblr&quot;=&gt;nil, &quot;twitter&quot;=&gt;nil, &quot;vine&quot;=&gt;nil, &quot;weibo&quot;=&gt;nil, &quot;wikipedia&quot;=&gt;nil, &quot;xing&quot;=&gt;nil, &quot;youtube&quot;=&gt;nil, &quot;zhihu&quot;=&gt;nil}</name><email>contact@parameterfreak.com</email></author><entry><title type="html">사내 GPU로 챗봇 만들기: vanilla Kubernetes + vLLM 직접 배포 vs 같은 일을 H-MAS로</title><link href="https://parameterfreak.com/posts/2026/07/k8s-vllm-vs-hmas/" rel="alternate" type="text/html" title="사내 GPU로 챗봇 만들기: vanilla Kubernetes + vLLM 직접 배포 vs 같은 일을 H-MAS로" /><published>2026-07-18T03:00:00+00:00</published><updated>2026-07-18T03:00:00+00:00</updated><id>https://parameterfreak.com/posts/2026/07/k8s-vllm-vs-hmas</id><content type="html" xml:base="https://parameterfreak.com/posts/2026/07/k8s-vllm-vs-hmas/"><![CDATA[<blockquote>
  <p>이 글의 모든 명령·출력·수치는 2026-07-18, 동일한 클러스터에서 두 경로를 실제로 실행하며 기록한 것입니다.</p>
</blockquote>

<hr />

<h2 id="1-들어가며">1. 들어가며</h2>

<p>“사내 GPU 서버에 오픈소스 LLM을 올려서, 팀원들이 쓸 수 있는 챗봇을 만들자.”</p>

<p>많은 팀이 여기서 출발합니다. 이 글에서는 같은 목표를 두 가지 방법으로 각각 처음부터 끝까지 해봅니다.</p>

<ol>
  <li>1부: vanilla Kubernetes에 vLLM을 직접 배포</li>
  <li>2부: 같은 일을 H-MAS 웹 콘솔로</li>
</ol>

<p>공정한 비교를 위해 조건을 통일했습니다. 두 경로 모두 같은 클러스터, 같은 모델, 같은 서빙 이미지를 사용했고, 실제 파드에 뜬 이미지가 동일함을 kubectl로 확인했습니다(실측 명령·출력은 3.1절에 수록).</p>

<table>
  <thead>
    <tr>
      <th>항목</th>
      <th>내용</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>클러스터</td>
      <td>research (단일 노드 microk8s)</td>
    </tr>
    <tr>
      <td>GPU</td>
      <td>NVIDIA RTX 5060 Ti 16GB × 1 (Blackwell, sm_120)</td>
    </tr>
    <tr>
      <td>드라이버 / CUDA</td>
      <td>580.159.03 / CUDA 13.0</td>
    </tr>
    <tr>
      <td>서빙 이미지</td>
      <td><code class="language-plaintext highlighter-rouge">vllm/vllm-openai:v0.19.1-cu130-ubuntu2404</code> (양쪽 동일, 실측 확인)</td>
    </tr>
    <tr>
      <td>모델</td>
      <td>Qwen/Qwen2.5-1.5B-Instruct (Apache 2.0, HF gated 아님)</td>
    </tr>
  </tbody>
</table>

<p>클라이언트 쪽도 통일했습니다. 뒤에서 소개할 콘솔 챗봇 스크립트 하나를 양쪽에 그대로 사용합니다.</p>

<hr />

<h2 id="2-1부-vanilla-kubernetes--vllm-직접-배포">2. 1부: vanilla Kubernetes + vLLM 직접 배포</h2>

<h3 id="21-gpu-노드-준비-상태-확인">2.1 GPU 노드 준비 상태 확인</h3>

<p>먼저 클러스터에 GPU가 스케줄 가능한 상태인지 확인합니다. 이 클러스터에는 NVIDIA GPU Operator가 이미 설치되어 있어, 노드의 <code class="language-plaintext highlighter-rouge">nvidia.com/gpu</code> capacity/allocatable과 device plugin 파드 상태를 확인하는 것으로 충분했습니다.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>kubectl get node research <span class="nt">-o</span> <span class="nv">jsonpath</span><span class="o">=</span><span class="s1">'{"capacity: "}{.status.capacity.nvidia\.com/gpu}{"\nallocatable: "}{.status.allocatable.nvidia\.com/gpu}{"\n"}'</span>
kubectl get pods <span class="nt">-n</span> gpu-operator-resources <span class="nt">-o</span> wide
</code></pre></div></div>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>capacity: 1
allocatable: 1
NAME                                                         READY   STATUS      RESTARTS   AGE
gpu-feature-discovery-k6b4j                                  1/1     Running     92         111d
gpu-operator-666bbffcd-m4cts                                 1/1     Running     126        111d
...(생략)...
nvidia-device-plugin-daemonset-jh8fv                         1/1     Running     37         44d
nvidia-operator-validator-9ccr2                              1/1     Running     92         111d
</code></pre></div></div>

<p>실측에서는 GPU를 점유 중인 파드가 없는 것도 별도 스크립트로 함께 확인했습니다(<code class="language-plaintext highlighter-rouge">GPU-occupying pods: NONE</code>). GPU 1장이 비어 있고 device plugin이 정상입니다. 참고로 GPU Operator가 없는 클러스터라면 이 단계 전에 드라이버·container toolkit·device plugin 설치부터 해야 합니다.</p>

<p>한 가지 미리 짚어둘 점. 이번에 쓰는 Qwen2.5-1.5B-Instruct는 gated 모델이 아니라서 그냥 받아지지만, Llama 계열처럼 gated 모델을 쓴다면 HF 토큰을 담은 Secret을 만들어 파드에 주입하는 단계가 하나 더 필요합니다. 이번 실측 범위에는 포함되지 않았습니다.</p>

<h3 id="22-매니페스트-작성">2.2 매니페스트 작성</h3>

<p>직접 쓰면 Namespace, 모델 캐시용 PVC, Deployment, Service 정도가 최소 구성입니다. 실제 사용한 매니페스트 전문입니다.</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">apiVersion</span><span class="pi">:</span> <span class="s">v1</span>
<span class="na">kind</span><span class="pi">:</span> <span class="s">Namespace</span>
<span class="na">metadata</span><span class="pi">:</span>
  <span class="na">name</span><span class="pi">:</span> <span class="s">blog-vanilla</span>
<span class="nn">---</span>
<span class="c1"># 모델 캐시 — 재시작 시 재다운로드를 피하기 위한 PVC</span>
<span class="na">apiVersion</span><span class="pi">:</span> <span class="s">v1</span>
<span class="na">kind</span><span class="pi">:</span> <span class="s">PersistentVolumeClaim</span>
<span class="na">metadata</span><span class="pi">:</span>
  <span class="na">name</span><span class="pi">:</span> <span class="s">model-cache</span>
  <span class="na">namespace</span><span class="pi">:</span> <span class="s">blog-vanilla</span>
<span class="na">spec</span><span class="pi">:</span>
  <span class="na">accessModes</span><span class="pi">:</span> <span class="pi">[</span><span class="s2">"</span><span class="s">ReadWriteOnce"</span><span class="pi">]</span>
  <span class="na">resources</span><span class="pi">:</span>
    <span class="na">requests</span><span class="pi">:</span>
      <span class="na">storage</span><span class="pi">:</span> <span class="s">20Gi</span>
<span class="nn">---</span>
<span class="na">apiVersion</span><span class="pi">:</span> <span class="s">apps/v1</span>
<span class="na">kind</span><span class="pi">:</span> <span class="s">Deployment</span>
<span class="na">metadata</span><span class="pi">:</span>
  <span class="na">name</span><span class="pi">:</span> <span class="s">vllm-qwen</span>
  <span class="na">namespace</span><span class="pi">:</span> <span class="s">blog-vanilla</span>
<span class="na">spec</span><span class="pi">:</span>
  <span class="na">replicas</span><span class="pi">:</span> <span class="m">1</span>
  <span class="na">selector</span><span class="pi">:</span>
    <span class="na">matchLabels</span><span class="pi">:</span>
      <span class="na">app</span><span class="pi">:</span> <span class="s">vllm-qwen</span>
  <span class="na">template</span><span class="pi">:</span>
    <span class="na">metadata</span><span class="pi">:</span>
      <span class="na">labels</span><span class="pi">:</span>
        <span class="na">app</span><span class="pi">:</span> <span class="s">vllm-qwen</span>
    <span class="na">spec</span><span class="pi">:</span>
      <span class="na">containers</span><span class="pi">:</span>
      <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">vllm</span>
        <span class="na">image</span><span class="pi">:</span> <span class="s">vllm/vllm-openai:v0.19.1-cu130-ubuntu2404</span>
        <span class="na">args</span><span class="pi">:</span>
        <span class="pi">-</span> <span class="s">--model</span>
        <span class="pi">-</span> <span class="s">Qwen/Qwen2.5-1.5B-Instruct</span>
        <span class="pi">-</span> <span class="s">--max-model-len</span>
        <span class="pi">-</span> <span class="s2">"</span><span class="s">8192"</span>
        <span class="na">ports</span><span class="pi">:</span>
        <span class="pi">-</span> <span class="na">containerPort</span><span class="pi">:</span> <span class="m">8000</span>
        <span class="na">resources</span><span class="pi">:</span>
          <span class="na">limits</span><span class="pi">:</span>
            <span class="na">nvidia.com/gpu</span><span class="pi">:</span> <span class="m">1</span>
        <span class="na">volumeMounts</span><span class="pi">:</span>
        <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">model-cache</span>
          <span class="na">mountPath</span><span class="pi">:</span> <span class="s">/root/.cache/huggingface</span>
        <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">shm</span>
          <span class="na">mountPath</span><span class="pi">:</span> <span class="s">/dev/shm</span>
        <span class="na">readinessProbe</span><span class="pi">:</span>
          <span class="na">httpGet</span><span class="pi">:</span>
            <span class="na">path</span><span class="pi">:</span> <span class="s">/health</span>
            <span class="na">port</span><span class="pi">:</span> <span class="m">8000</span>
          <span class="na">initialDelaySeconds</span><span class="pi">:</span> <span class="m">30</span>
          <span class="na">periodSeconds</span><span class="pi">:</span> <span class="m">10</span>
      <span class="na">volumes</span><span class="pi">:</span>
      <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">model-cache</span>
        <span class="na">persistentVolumeClaim</span><span class="pi">:</span>
          <span class="na">claimName</span><span class="pi">:</span> <span class="s">model-cache</span>
      <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">shm</span>
        <span class="na">emptyDir</span><span class="pi">:</span>
          <span class="na">medium</span><span class="pi">:</span> <span class="s">Memory</span>
          <span class="na">sizeLimit</span><span class="pi">:</span> <span class="s">2Gi</span>
<span class="nn">---</span>
<span class="na">apiVersion</span><span class="pi">:</span> <span class="s">v1</span>
<span class="na">kind</span><span class="pi">:</span> <span class="s">Service</span>
<span class="na">metadata</span><span class="pi">:</span>
  <span class="na">name</span><span class="pi">:</span> <span class="s">vllm-qwen</span>
  <span class="na">namespace</span><span class="pi">:</span> <span class="s">blog-vanilla</span>
<span class="na">spec</span><span class="pi">:</span>
  <span class="na">type</span><span class="pi">:</span> <span class="s">NodePort</span>
  <span class="na">selector</span><span class="pi">:</span>
    <span class="na">app</span><span class="pi">:</span> <span class="s">vllm-qwen</span>
  <span class="na">ports</span><span class="pi">:</span>
  <span class="pi">-</span> <span class="na">port</span><span class="pi">:</span> <span class="m">8000</span>
    <span class="na">targetPort</span><span class="pi">:</span> <span class="m">8000</span>
    <span class="na">nodePort</span><span class="pi">:</span> <span class="m">30800</span>
</code></pre></div></div>

<p>78줄입니다. 짧아 보이지만 <code class="language-plaintext highlighter-rouge">/dev/shm</code> 마운트, 모델 캐시 PVC, readiness probe 경로 같은 것들은 한 번씩 겪어보고 나서야 넣게 되는 항목들입니다.</p>

<h3 id="23-배포와-기동-대기">2.3 배포와 기동 대기</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>kubectl apply <span class="nt">-f</span> vllm-qwen.yaml
</code></pre></div></div>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>namespace/blog-vanilla created
persistentvolumeclaim/model-cache created
deployment.apps/vllm-qwen created
service/vllm-qwen created
</code></pre></div></div>

<p>rollout이 끝나기를 기다립니다.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>kubectl rollout status deploy/vllm-qwen <span class="nt">-n</span> blog-vanilla <span class="nt">--timeout</span><span class="o">=</span>600s
kubectl get pods <span class="nt">-n</span> blog-vanilla <span class="nt">-o</span> wide
</code></pre></div></div>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Waiting for deployment "vllm-qwen" rollout to finish: 0 of 1 updated replicas are available...
deployment "vllm-qwen" successfully rolled out
NAME                         READY   STATUS    RESTARTS   AGE     IP            NODE
vllm-qwen-6fbd46c88c-btqgq   1/1     Running   0          6m30s   10.1.38.249   research
</code></pre></div></div>

<p>파드가 Ready가 되기까지 약 6분 30초가 걸렸습니다. 시간이 어디에 쓰였는지 기동 로그를 보면 답이 나옵니다.</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>(APIServer pid=1) INFO 07-18 01:51:14 [utils.py:299]        █     █     █▄   ▄█
(APIServer pid=1) INFO 07-18 01:51:14 [utils.py:299]  ▄▄ ▄█ █     █     █ ▀▄▀ █  version 0.19.1
(APIServer pid=1) INFO 07-18 01:51:14 [utils.py:299]   █▄█▀ █     █     █     █  model   Qwen/Qwen2.5-1.5B-Instruct
...(생략)...
(APIServer pid=1) Warning: You are sending unauthenticated requests to the HF Hub. Please set a HF_TOKEN to enable higher rate limits and faster downloads.
...(생략)...
(EngineCore pid=73) INFO 07-18 01:55:42 [weight_utils.py:581] Time spent downloading weights for Qwen/Qwen2.5-1.5B-Instruct: 249.323250 seconds
...(생략)...
(EngineCore pid=73) INFO 07-18 01:57:08 [core.py:283] init engine (profile, create kv cache, warmup model) took 84.57 seconds
...(생략)...
(APIServer pid=1) INFO 07-18 01:57:15 [api_server.py:596] Starting vLLM server on http://0.0.0.0:8000
(APIServer pid=1) INFO:     Application startup complete.
</code></pre></div></div>

<p>6분 30초의 대부분은 모델 가중치 다운로드(249.3초)였고, 엔진 초기화(프로파일링·KV 캐시·워밍업)에 84.57초가 더 쓰였습니다. 이미지가 노드에 미리 받아져 있어도 가중치는 따로 다운로드해야 합니다. 로그의 HF 미인증 경고는 토큰 없이 받으면 rate limit이 낮아 다운로드가 더 느려질 수 있다는 안내입니다.</p>

<h3 id="24-api-확인">2.4 API 확인</h3>

<p>접근 경로는 두 가지입니다. 매니페스트에 NodePort 30800을 넣어두었으니 클러스터 네트워크 상황에 따라 그쪽을 써도 되고, 이번 실측은 <code class="language-plaintext highlighter-rouge">kubectl port-forward</code>로 서비스의 8000 포트를 로컬에 연결해 진행했습니다.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>kubectl port-forward <span class="nt">-n</span> blog-vanilla svc/vllm-qwen 8000:8000
</code></pre></div></div>

<p>port-forward는 포그라운드로 계속 떠 있으므로, 이후 명령은 별도 터미널에서 실행합니다. 이제 OpenAI 호환 API를 호출해 봅니다.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>curl <span class="nt">-s</span> http://localhost:8000/v1/models | python3 <span class="nt">-m</span> json.tool
</code></pre></div></div>

<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="w">
    </span><span class="nl">"object"</span><span class="p">:</span><span class="w"> </span><span class="s2">"list"</span><span class="p">,</span><span class="w">
    </span><span class="nl">"data"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
        </span><span class="p">{</span><span class="w">
            </span><span class="nl">"id"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Qwen/Qwen2.5-1.5B-Instruct"</span><span class="p">,</span><span class="w">
            </span><span class="nl">"object"</span><span class="p">:</span><span class="w"> </span><span class="s2">"model"</span><span class="p">,</span><span class="w">
            </span><span class="nl">"created"</span><span class="p">:</span><span class="w"> </span><span class="mi">1784339970</span><span class="p">,</span><span class="w">
            </span><span class="nl">"owned_by"</span><span class="p">:</span><span class="w"> </span><span class="s2">"vllm"</span><span class="p">,</span><span class="w">
            </span><span class="nl">"max_model_len"</span><span class="p">:</span><span class="w"> </span><span class="mi">8192</span><span class="p">,</span><span class="w">
            </span><span class="err">...(생략)...</span><span class="w">
        </span><span class="p">}</span><span class="w">
    </span><span class="p">]</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>curl <span class="nt">-s</span> http://localhost:8000/v1/chat/completions <span class="se">\</span>
  <span class="nt">-H</span> <span class="s2">"Content-Type: application/json"</span> <span class="se">\</span>
  <span class="nt">-d</span> <span class="s1">'{
    "model": "Qwen/Qwen2.5-1.5B-Instruct",
    "messages": [{"role": "user", "content": "안녕하세요! 자기소개 한 문장 부탁해요."}]
  }'</span> | python3 <span class="nt">-m</span> json.tool
</code></pre></div></div>

<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="w">
    </span><span class="nl">"id"</span><span class="p">:</span><span class="w"> </span><span class="s2">"chatcmpl-b6d82e88c01cdc75"</span><span class="p">,</span><span class="w">
    </span><span class="nl">"object"</span><span class="p">:</span><span class="w"> </span><span class="s2">"chat.completion"</span><span class="p">,</span><span class="w">
    </span><span class="nl">"model"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Qwen/Qwen2.5-1.5B-Instruct"</span><span class="p">,</span><span class="w">
    </span><span class="nl">"choices"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
        </span><span class="p">{</span><span class="w">
            </span><span class="nl">"index"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w">
            </span><span class="nl">"message"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
                </span><span class="nl">"role"</span><span class="p">:</span><span class="w"> </span><span class="s2">"assistant"</span><span class="p">,</span><span class="w">
                </span><span class="nl">"content"</span><span class="p">:</span><span class="w"> </span><span class="s2">"물론입니다! 저는 AI 언어 모델 Qwen을 사용한 인공지능助手로, 여러분의 질문에 최선을 다하여 답변하고 도움을 드리고 있습니다. 무엇이든 물어보세요!"</span><span class="w">
            </span><span class="p">},</span><span class="w">
            </span><span class="nl">"finish_reason"</span><span class="p">:</span><span class="w"> </span><span class="s2">"stop"</span><span class="w">
        </span><span class="p">}</span><span class="w">
    </span><span class="p">],</span><span class="w">
    </span><span class="nl">"usage"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
        </span><span class="nl">"prompt_tokens"</span><span class="p">:</span><span class="w"> </span><span class="mi">44</span><span class="p">,</span><span class="w">
        </span><span class="nl">"total_tokens"</span><span class="p">:</span><span class="w"> </span><span class="mi">95</span><span class="p">,</span><span class="w">
        </span><span class="nl">"completion_tokens"</span><span class="p">:</span><span class="w"> </span><span class="mi">51</span><span class="w">
    </span><span class="p">},</span><span class="w">
    </span><span class="err">...(생략)...</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>

<p>OpenAI 호환 API가 잘 동작합니다. (1.5B 소형 모델이라 답변에 한자·일본어가 가끔 섞이는 것은 모델 특성입니다.)</p>

<h3 id="25-콘솔-챗봇-연결">2.5 콘솔 챗봇 연결</h3>

<p>이제 목표였던 챗봇입니다. 의존성은 OpenAI SDK 하나뿐입니다.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>pip <span class="nb">install </span>openai
</code></pre></div></div>

<p>약 50줄짜리 콘솔 챗봇 스크립트 전문입니다. 이 스크립트를 2부에서도 한 글자도 고치지 않고 다시 씁니다.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">#!/usr/bin/env python3
</span><span class="s">"""콘솔 챗봇 — OpenAI 호환 엔드포인트에 연결하는 채팅 루프.

환경 변수:
  CHAT_BASE_URL  OpenAI 호환 엔드포인트 (기본: http://localhost:8000/v1)
  CHAT_API_KEY   API 키 (vanilla vLLM은 불필요 — 아무 값이나 가능)
  CHAT_MODEL     모델 이름
"""</span>
<span class="kn">import</span> <span class="nn">os</span>

<span class="kn">from</span> <span class="nn">openai</span> <span class="kn">import</span> <span class="n">OpenAI</span>

<span class="n">BASE_URL</span> <span class="o">=</span> <span class="n">os</span><span class="p">.</span><span class="n">environ</span><span class="p">.</span><span class="n">get</span><span class="p">(</span><span class="s">"CHAT_BASE_URL"</span><span class="p">,</span> <span class="s">"http://localhost:8000/v1"</span><span class="p">)</span>
<span class="n">API_KEY</span> <span class="o">=</span> <span class="n">os</span><span class="p">.</span><span class="n">environ</span><span class="p">.</span><span class="n">get</span><span class="p">(</span><span class="s">"CHAT_API_KEY"</span><span class="p">,</span> <span class="s">"not-needed"</span><span class="p">)</span>
<span class="n">MODEL</span> <span class="o">=</span> <span class="n">os</span><span class="p">.</span><span class="n">environ</span><span class="p">.</span><span class="n">get</span><span class="p">(</span><span class="s">"CHAT_MODEL"</span><span class="p">,</span> <span class="s">"Qwen/Qwen2.5-1.5B-Instruct"</span><span class="p">)</span>

<span class="n">client</span> <span class="o">=</span> <span class="n">OpenAI</span><span class="p">(</span><span class="n">base_url</span><span class="o">=</span><span class="n">BASE_URL</span><span class="p">,</span> <span class="n">api_key</span><span class="o">=</span><span class="n">API_KEY</span><span class="p">)</span>
<span class="n">history</span> <span class="o">=</span> <span class="p">[{</span><span class="s">"role"</span><span class="p">:</span> <span class="s">"system"</span><span class="p">,</span> <span class="s">"content"</span><span class="p">:</span> <span class="s">"당신은 친절한 사내 어시스턴트입니다. 한국어로 간결하게 답하세요."</span><span class="p">}]</span>

<span class="k">print</span><span class="p">(</span><span class="sa">f</span><span class="s">"모델: </span><span class="si">{</span><span class="n">MODEL</span><span class="si">}</span><span class="s">"</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="sa">f</span><span class="s">"엔드포인트: </span><span class="si">{</span><span class="n">BASE_URL</span><span class="si">}</span><span class="s">"</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="s">"대화를 시작하세요. 종료: /quit"</span><span class="p">)</span>

<span class="k">while</span> <span class="bp">True</span><span class="p">:</span>
    <span class="k">try</span><span class="p">:</span>
        <span class="n">user_input</span> <span class="o">=</span> <span class="nb">input</span><span class="p">(</span><span class="s">"</span><span class="se">\n</span><span class="s">나&gt; "</span><span class="p">).</span><span class="n">strip</span><span class="p">()</span>
    <span class="k">except</span> <span class="p">(</span><span class="nb">EOFError</span><span class="p">,</span> <span class="nb">KeyboardInterrupt</span><span class="p">):</span>
        <span class="k">break</span>
    <span class="k">if</span> <span class="ow">not</span> <span class="n">user_input</span><span class="p">:</span>
        <span class="k">continue</span>
    <span class="k">if</span> <span class="n">user_input</span> <span class="o">==</span> <span class="s">"/quit"</span><span class="p">:</span>
        <span class="k">break</span>
    <span class="n">history</span><span class="p">.</span><span class="n">append</span><span class="p">({</span><span class="s">"role"</span><span class="p">:</span> <span class="s">"user"</span><span class="p">,</span> <span class="s">"content"</span><span class="p">:</span> <span class="n">user_input</span><span class="p">})</span>
    <span class="k">try</span><span class="p">:</span>
        <span class="n">stream</span> <span class="o">=</span> <span class="n">client</span><span class="p">.</span><span class="n">chat</span><span class="p">.</span><span class="n">completions</span><span class="p">.</span><span class="n">create</span><span class="p">(</span><span class="n">model</span><span class="o">=</span><span class="n">MODEL</span><span class="p">,</span> <span class="n">messages</span><span class="o">=</span><span class="n">history</span><span class="p">,</span> <span class="n">stream</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
        <span class="k">print</span><span class="p">(</span><span class="s">"봇&gt; "</span><span class="p">,</span> <span class="n">end</span><span class="o">=</span><span class="s">""</span><span class="p">,</span> <span class="n">flush</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
        <span class="n">chunks</span> <span class="o">=</span> <span class="p">[]</span>
        <span class="k">for</span> <span class="n">chunk</span> <span class="ow">in</span> <span class="n">stream</span><span class="p">:</span>
            <span class="k">if</span> <span class="ow">not</span> <span class="n">chunk</span><span class="p">.</span><span class="n">choices</span><span class="p">:</span>
                <span class="k">continue</span>
            <span class="n">delta</span> <span class="o">=</span> <span class="n">chunk</span><span class="p">.</span><span class="n">choices</span><span class="p">[</span><span class="mi">0</span><span class="p">].</span><span class="n">delta</span><span class="p">.</span><span class="n">content</span> <span class="ow">or</span> <span class="s">""</span>
            <span class="n">chunks</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">delta</span><span class="p">)</span>
            <span class="k">print</span><span class="p">(</span><span class="n">delta</span><span class="p">,</span> <span class="n">end</span><span class="o">=</span><span class="s">""</span><span class="p">,</span> <span class="n">flush</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
        <span class="k">print</span><span class="p">()</span>
    <span class="k">except</span> <span class="nb">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
        <span class="k">print</span><span class="p">(</span><span class="sa">f</span><span class="s">"</span><span class="se">\n</span><span class="s">[오류] 요청 실패: </span><span class="si">{</span><span class="n">e</span><span class="si">}</span><span class="s">"</span><span class="p">)</span>
        <span class="n">history</span><span class="p">.</span><span class="n">pop</span><span class="p">()</span>
        <span class="k">continue</span>
    <span class="n">history</span><span class="p">.</span><span class="n">append</span><span class="p">({</span><span class="s">"role"</span><span class="p">:</span> <span class="s">"assistant"</span><span class="p">,</span> <span class="s">"content"</span><span class="p">:</span> <span class="s">""</span><span class="p">.</span><span class="n">join</span><span class="p">(</span><span class="n">chunks</span><span class="p">)})</span>
</code></pre></div></div>

<p>port-forward가 열려 있으면 환경 변수 없이 그대로 실행됩니다.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>python chatbot.py
</code></pre></div></div>

<p>실제 대화 기록입니다. (실측 시 질문을 stdin 파이프로 넣어 원 로그에는 질문이 에코되지 않았기에, 아래는 고정 질문을 표기상 복원한 것입니다. 봇의 답변은 로그 그대로입니다.)</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>모델: Qwen/Qwen2.5-1.5B-Instruct
엔드포인트: http://localhost:8000/v1
대화를 시작하세요. 종료: /quit

나&gt; 안녕하세요! 사내 GPU에서 서빙 중인 모델이에요. 자기소개 부탁해요.
봇&gt; 안녕하세요, 저는 사내 GPU에서 작업 중인 AI 어시스턴트입니다. 언제든지 도움을 드리겠습니다.

나&gt; Kubernetes가 뭔지 두 문장으로 설명해줘.
봇&gt; Kubernetes는 자동화된 클러스터 관리 시스템으로, 애플리케이션을 쉽게 배포하고 운영할 수 있게 해줍니다.
</code></pre></div></div>

<p>챗봇 완성입니다. 여기까지 매니페스트 78줄 + 스크립트 하나로 목표를 달성했습니다.</p>

<h3 id="26-여기서-멈추면-남는-것들">2.6 여기서 멈추면 남는 것들</h3>

<p>그런데 이걸 “팀원들이 쓰는 서비스”라고 부르려는 순간, 몇 가지가 걸립니다. 실제로 확인해 봤습니다.</p>

<p><strong>① 인증이 없다.</strong> 인증 헤더 없이 chat completions를 호출해 봤습니다.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>curl <span class="nt">-s</span> <span class="nt">-o</span> /dev/null <span class="nt">-w</span> <span class="s2">"no-auth chat: %{http_code}</span><span class="se">\n</span><span class="s2">"</span> http://localhost:8000/v1/chat/completions <span class="se">\</span>
  <span class="nt">-H</span> <span class="s2">"Content-Type: application/json"</span> <span class="se">\</span>
  <span class="nt">-d</span> <span class="s1">'{"model": "Qwen/Qwen2.5-1.5B-Instruct", "messages": [{"role": "user", "content": "hi"}]}'</span>
</code></pre></div></div>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>no-auth chat: 200
</code></pre></div></div>

<p>vLLM 기본 배포에는 인증 개념이 없습니다. 엔드포인트를 아는 사람은 누구나 GPU를 쓸 수 있습니다.</p>

<p><strong>② 관측은 raw /metrics뿐.</strong> <code class="language-plaintext highlighter-rouge">/metrics</code>는 Prometheus 텍스트를 뱉지만, 수집기도 대시보드도 없고 요청자 구분도 없습니다.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>curl <span class="nt">-s</span> http://localhost:8000/metrics | <span class="nb">grep</span> <span class="nt">-E</span> <span class="s2">"^vllm:"</span> | <span class="nb">head</span> <span class="nt">-10</span>
</code></pre></div></div>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>...(생략)...
vllm:num_requests_running{engine="0",model_name="Qwen/Qwen2.5-1.5B-Instruct"} 0.0
vllm:num_requests_waiting{engine="0",model_name="Qwen/Qwen2.5-1.5B-Instruct"} 0.0
vllm:engine_sleep_state{engine="0",model_name="Qwen/Qwen2.5-1.5B-Instruct",sleep_state="awake"} 1.0
...(생략)...
</code></pre></div></div>

<p><strong>③ 누가 얼마나 썼는지 알 수 없다.</strong> 사용자/키별 사용량 추적은 해당 개념 자체가 없습니다. 요청자 구분이 불가능합니다.</p>

<p><strong>④ 노출 관리도 숙제.</strong> NodePort를 열면 클러스터 네트워크 정책·방화벽을 직접 챙겨야 하고, port-forward는 데모용이지 서비스용이 아닙니다.</p>

<p>이것들을 vanilla로 해결하려면 인증 프록시, rate limiter, Prometheus + Grafana, 로깅 파이프라인을 각각 추가로 구축해야 합니다. 전부 가능한 일이지만, “챗봇 하나 띄우기”에서 시작한 일 치고는 스코프가 꽤 커집니다.</p>

<p>실험을 마치고 네임스페이스를 지워 GPU를 반납했습니다.</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>namespace "blog-vanilla" deleted
GPU-occupying pods: 0
</code></pre></div></div>

<hr />

<h2 id="3-2부-같은-일을-h-mas로">3. 2부: 같은 일을 H-MAS로</h2>

<p>이번엔 같은 클러스터, 같은 모델, 같은 이미지를 H-MAS로 배포합니다. H-MAS 설치 자체는 이 글의 범위가 아니므로(이번 실측에서도 이미 설치된 환경을 사용했습니다) 설치 절차는 기존 문서를 참고해 주세요. 웹 콘솔은 <code class="language-plaintext highlighter-rouge">http://research.parameterfreak.com:9110</code>입니다.</p>

<h3 id="31-웹-콘솔에서-배포">3.1 웹 콘솔에서 배포</h3>

<p>H-MAS에서는 YAML 대신 배포 위자드에서 모델·런타임(vLLM)·대상 클러스터·리소스를 폼으로 선택합니다.</p>

<p><img src="/images/blog-514/deploy-form.png" alt="H-MAS 배포 위자드" /></p>

<p><em>배포 위자드 1단계: Qwen 2.5 1.5B와 vLLM 런타임 선택 (이번 실측 환경에서 캡처)</em></p>

<p>배포는 웹 콘솔로도, 같은 기능의 REST API로도 만들 수 있습니다. 이번 실측은 출력을 그대로 남기려고 API로 진행했습니다. 배포 생성 직후 응답입니다.</p>

<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="w">
    </span><span class="nl">"id"</span><span class="p">:</span><span class="w"> </span><span class="s2">"3"</span><span class="p">,</span><span class="w">
    </span><span class="nl">"name"</span><span class="p">:</span><span class="w"> </span><span class="s2">"blog-qwen"</span><span class="p">,</span><span class="w">
    </span><span class="nl">"status"</span><span class="p">:</span><span class="w"> </span><span class="s2">"pending"</span><span class="p">,</span><span class="w">
    </span><span class="nl">"message"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Deployment created. Model 'Qwen/Qwen2.5-1.5B-Instruct' will be served on research using vLLM."</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>

<p>상태를 폴링하며 기다립니다.</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>[1] status=pending
[2] status=pending
...(생략)...
[24] status=pending
[25] status=running
RUNNING reached at iteration 25 (~375s ≈ 6.25min from creation)
</code></pre></div></div>

<p>생성부터 running까지 375초. 1부와 거의 같은 시간인데, 당연한 결과입니다. 콜드 스타트를 지배하는 모델 가중치 다운로드는 어느 경로로 배포하든 똑같이 발생하기 때문입니다. H-MAS가 줄여주는 것은 이 대기 시간이 아니라, YAML을 쓰고 접근 경로와 인증을 붙이는 사람의 작업입니다.</p>

<p>“같은 이미지” 주장도 여기서 실측으로 확인해 둡니다. H-MAS가 띄운 파드의 실제 컨테이너 이미지를 조회해 보면 1부에서 직접 쓴 이미지와 동일합니다.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>kubectl get pods <span class="nt">-n</span> hmas-serving <span class="nt">-o</span> <span class="nv">jsonpath</span><span class="o">=</span><span class="s1">'{range .items[*]}{.metadata.name}{"\t"}{.spec.containers[*].image}{"\n"}{end}'</span>
</code></pre></div></div>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>hmas-blog-qwen-5f9486b5c6-mvh7s	vllm/vllm-openai:v0.19.1-cu130-ubuntu2404
</code></pre></div></div>

<h3 id="32-api-키-발급과-rpm-지정">3.2 API 키 발급과 RPM 지정</h3>

<p>콘솔의 API 키 메뉴에서 키를 발급합니다. 이때 분당 요청 수(RPM) 제한을 함께 지정할 수 있습니다. 실험용으로 일부러 빡빡하게 RPM 5로 만들었습니다.</p>

<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="w">
  </span><span class="nl">"id"</span><span class="p">:</span><span class="w"> </span><span class="mi">4</span><span class="p">,</span><span class="w">
  </span><span class="nl">"name"</span><span class="p">:</span><span class="w"> </span><span class="s2">"blog-demo"</span><span class="p">,</span><span class="w">
  </span><span class="nl">"key"</span><span class="p">:</span><span class="w"> </span><span class="s2">"sk-hmas-d858...(마스킹)"</span><span class="p">,</span><span class="w">
  </span><span class="nl">"keyPrefix"</span><span class="p">:</span><span class="w"> </span><span class="s2">"sk-hmas-d858"</span><span class="p">,</span><span class="w">
  </span><span class="nl">"username"</span><span class="p">:</span><span class="w"> </span><span class="s2">"admin"</span><span class="p">,</span><span class="w">
  </span><span class="nl">"rateLimitRpm"</span><span class="p">:</span><span class="w"> </span><span class="mi">5</span><span class="p">,</span><span class="w">
  </span><span class="nl">"createdAt"</span><span class="p">:</span><span class="w"> </span><span class="s2">"2026-07-18T02:17:25Z"</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>

<p><img src="/images/blog-514/api-keys.png" alt="H-MAS API 키 관리" /></p>

<p><em>API 키 관리 화면: 키 목록과 RPM 표시 (이번 실측 환경에서 캡처)</em></p>

<p>배포된 모델은 OpenAI 호환 추론 프록시 <code class="language-plaintext highlighter-rouge">http://research.parameterfreak.com:9110/api/inference/blog-qwen/v1</code>로 노출됩니다. 프록시는 발급받은 키를 <code class="language-plaintext highlighter-rouge">Authorization: Bearer</code> 헤더로 받습니다. curl로 확인해 봅니다. (<code class="language-plaintext highlighter-rouge">$HMAS_KEY</code>에는 발급받은 키 원문을 넣습니다.)</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">HMAS</span><span class="o">=</span>http://research.parameterfreak.com:9110

curl <span class="nt">-s</span> <span class="nt">-H</span> <span class="s2">"Authorization: Bearer </span><span class="nv">$HMAS_KEY</span><span class="s2">"</span> <span class="s2">"</span><span class="nv">$HMAS</span><span class="s2">/api/inference/blog-qwen/v1/models"</span> | python3 <span class="nt">-m</span> json.tool
</code></pre></div></div>

<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="w">
    </span><span class="nl">"object"</span><span class="p">:</span><span class="w"> </span><span class="s2">"list"</span><span class="p">,</span><span class="w">
    </span><span class="nl">"data"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
        </span><span class="p">{</span><span class="w">
            </span><span class="nl">"id"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Qwen/Qwen2.5-1.5B-Instruct"</span><span class="p">,</span><span class="w">
            </span><span class="nl">"object"</span><span class="p">:</span><span class="w"> </span><span class="s2">"model"</span><span class="p">,</span><span class="w">
            </span><span class="nl">"owned_by"</span><span class="p">:</span><span class="w"> </span><span class="s2">"vllm"</span><span class="p">,</span><span class="w">
            </span><span class="nl">"max_model_len"</span><span class="p">:</span><span class="w"> </span><span class="mi">32768</span><span class="p">,</span><span class="w">
            </span><span class="err">...(생략)...</span><span class="w">
        </span><span class="p">}</span><span class="w">
    </span><span class="p">]</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>curl <span class="nt">-s</span> <span class="nt">-H</span> <span class="s2">"Authorization: Bearer </span><span class="nv">$HMAS_KEY</span><span class="s2">"</span> <span class="nt">-H</span> <span class="s2">"Content-Type: application/json"</span> <span class="se">\</span>
  <span class="s2">"</span><span class="nv">$HMAS</span><span class="s2">/api/inference/blog-qwen/v1/chat/completions"</span> <span class="se">\</span>
  <span class="nt">-d</span> <span class="s1">'{
    "model": "Qwen/Qwen2.5-1.5B-Instruct",
    "messages": [{"role": "user", "content": "안녕하세요! 자기소개 한 문장 부탁해요."}]
  }'</span> | python3 <span class="nt">-m</span> json.tool
</code></pre></div></div>

<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="w">
    </span><span class="nl">"id"</span><span class="p">:</span><span class="w"> </span><span class="s2">"chatcmpl-a5b201f1ef7a7624"</span><span class="p">,</span><span class="w">
    </span><span class="nl">"object"</span><span class="p">:</span><span class="w"> </span><span class="s2">"chat.completion"</span><span class="p">,</span><span class="w">
    </span><span class="nl">"model"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Qwen/Qwen2.5-1.5B-Instruct"</span><span class="p">,</span><span class="w">
    </span><span class="err">...(생략)...</span><span class="w">
    </span><span class="nl">"usage"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
        </span><span class="nl">"prompt_tokens"</span><span class="p">:</span><span class="w"> </span><span class="mi">44</span><span class="p">,</span><span class="w">
        </span><span class="nl">"total_tokens"</span><span class="p">:</span><span class="w"> </span><span class="mi">70</span><span class="p">,</span><span class="w">
        </span><span class="nl">"completion_tokens"</span><span class="p">:</span><span class="w"> </span><span class="mi">26</span><span class="w">
    </span><span class="p">},</span><span class="w">
    </span><span class="err">...(생략)...</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>

<p>1부와 같은 vLLM이 같은 이미지로 응답합니다. (<code class="language-plaintext highlighter-rouge">max_model_len</code>이 32768인 것은 1부 매니페스트에서는 8192로 명시 제한했고 여기서는 런타임 기본값이 적용됐기 때문입니다.)</p>

<h3 id="33-같은-챗봇-환경-변수-2개만-교체">3.3 같은 챗봇, 환경 변수 2개만 교체</h3>

<p>2.5절의 챗봇 스크립트를 코드 수정 없이 그대로 씁니다. 바꾸는 것은 엔드포인트와 API 키, 환경 변수 두 개뿐입니다.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">CHAT_BASE_URL</span><span class="o">=</span>http://research.parameterfreak.com:9110/api/inference/blog-qwen/v1 <span class="se">\</span>
<span class="nv">CHAT_API_KEY</span><span class="o">=</span>sk-hmas-d858...<span class="o">(</span>발급받은 키<span class="o">)</span> <span class="se">\</span>
python chatbot.py
</code></pre></div></div>

<p>실제 대화 기록입니다. (1부와 마찬가지로 질문은 표기상 복원, 답변은 로그 그대로입니다.)</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>모델: Qwen/Qwen2.5-1.5B-Instruct
엔드포인트: http://research.parameterfreak.com:9110/api/inference/blog-qwen/v1
대화를 시작하세요. 종료: /quit

나&gt; 안녕하세요! 이번엔 H-MAS 추론 프록시를 통해 접속했어요. 자기소개 부탁해요.
봇&gt; 안녕하세요, 저는 H-MAS 추론 프록시의 사내 어시스턴트입니다. 무엇을 도와드릴까요?

나&gt; Kubernetes가 뭔지 두 문장으로 설명해줘.
봇&gt; Kubernetes는 개발자들이 쉽게 배포하고 관리할 수 있는 클라우드 컴퓨팅 환경입니다.
</code></pre></div></div>

<p>OpenAI 호환 프록시이기 때문에 기존 OpenAI SDK 기반 코드가 그대로 붙습니다.</p>

<h3 id="34-1부의-미해결-항목-다시-실측">3.4 1부의 미해결 항목, 다시 실측</h3>

<p>2.6절에서 남았던 항목들을 같은 방식으로 다시 확인해 봤습니다.</p>

<p><strong>① 무인증 호출 → 차단.</strong> 2.6절과 같은 형태의 curl에서 <code class="language-plaintext highlighter-rouge">Authorization</code> 헤더만 뺀 요청입니다.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>curl <span class="nt">-s</span> <span class="nt">-o</span> /dev/null <span class="nt">-w</span> <span class="s2">"no-auth chat: %{http_code}</span><span class="se">\n</span><span class="s2">"</span> <span class="se">\</span>
  <span class="nt">-H</span> <span class="s2">"Content-Type: application/json"</span> <span class="se">\</span>
  <span class="s2">"</span><span class="nv">$HMAS</span><span class="s2">/api/inference/blog-qwen/v1/chat/completions"</span> <span class="se">\</span>
  <span class="nt">-d</span> <span class="s1">'{"model": "Qwen/Qwen2.5-1.5B-Instruct", "messages": [{"role": "user", "content": "hi"}]}'</span>
</code></pre></div></div>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>no-auth chat: 401
</code></pre></div></div>

<p>1부에서 200이었던 무인증 호출이 여기서는 401로 거부됩니다.</p>

<p><strong>② RPM 제한이 실제로 동작.</strong> RPM 5짜리 키로 연속 8회 호출해 봤습니다.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">for </span>i <span class="k">in</span> <span class="si">$(</span><span class="nb">seq </span>1 8<span class="si">)</span><span class="p">;</span> <span class="k">do
  </span>curl <span class="nt">-s</span> <span class="nt">-o</span> /dev/null <span class="nt">-w</span> <span class="s2">"req </span><span class="nv">$i</span><span class="s2">: %{http_code}</span><span class="se">\n</span><span class="s2">"</span> <span class="se">\</span>
    <span class="nt">-H</span> <span class="s2">"Authorization: Bearer </span><span class="nv">$HMAS_KEY</span><span class="s2">"</span> <span class="nt">-H</span> <span class="s2">"Content-Type: application/json"</span> <span class="se">\</span>
    <span class="s2">"</span><span class="nv">$HMAS</span><span class="s2">/api/inference/blog-qwen/v1/chat/completions"</span> <span class="se">\</span>
    <span class="nt">-d</span> <span class="s1">'{"model": "Qwen/Qwen2.5-1.5B-Instruct", "messages": [{"role": "user", "content": "hi"}], "max_tokens": 5}'</span>
<span class="k">done</span>
</code></pre></div></div>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>req 1: 200
req 2: 200
req 3: 200
req 4: 200
req 5: 200
req 6: 429
req 7: 429
req 8: 429
</code></pre></div></div>

<p>5회까지 통과, 6회째부터 429로 차단됩니다.</p>

<p><strong>③ 요청자별 추론 로그.</strong> 프록시를 지난 모든 성공 요청이 누가·어떤 키로·어떤 배포에·몇 토큰을 썼는지와 함께 기록됩니다.</p>

<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="w">
    </span><span class="nl">"id"</span><span class="p">:</span><span class="w"> </span><span class="mi">48</span><span class="p">,</span><span class="w">
    </span><span class="nl">"requestId"</span><span class="p">:</span><span class="w"> </span><span class="s2">"dd6b6007-ed06-47c1-b4be-7879a941086c"</span><span class="p">,</span><span class="w">
    </span><span class="nl">"username"</span><span class="p">:</span><span class="w"> </span><span class="s2">"admin"</span><span class="p">,</span><span class="w">
    </span><span class="nl">"authMethod"</span><span class="p">:</span><span class="w"> </span><span class="s2">"api_key"</span><span class="p">,</span><span class="w">
    </span><span class="nl">"apiKeyId"</span><span class="p">:</span><span class="w"> </span><span class="mi">4</span><span class="p">,</span><span class="w">
    </span><span class="nl">"apiKeyName"</span><span class="p">:</span><span class="w"> </span><span class="s2">"blog-demo"</span><span class="p">,</span><span class="w">
    </span><span class="nl">"deploymentName"</span><span class="p">:</span><span class="w"> </span><span class="s2">"blog-qwen"</span><span class="p">,</span><span class="w">
    </span><span class="nl">"modelName"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Qwen/Qwen2.5-1.5B-Instruct"</span><span class="p">,</span><span class="w">
    </span><span class="nl">"clusterName"</span><span class="p">:</span><span class="w"> </span><span class="s2">"research"</span><span class="p">,</span><span class="w">
    </span><span class="nl">"requestedAt"</span><span class="p">:</span><span class="w"> </span><span class="s2">"2026-07-18T02:19:36Z"</span><span class="p">,</span><span class="w">
    </span><span class="nl">"respondedAt"</span><span class="p">:</span><span class="w"> </span><span class="s2">"2026-07-18T02:19:36Z"</span><span class="p">,</span><span class="w">
    </span><span class="nl">"ttfbMs"</span><span class="p">:</span><span class="w"> </span><span class="mi">69</span><span class="p">,</span><span class="w">
    </span><span class="nl">"durationMs"</span><span class="p">:</span><span class="w"> </span><span class="mi">69</span><span class="p">,</span><span class="w">
    </span><span class="nl">"statusCode"</span><span class="p">:</span><span class="w"> </span><span class="mi">200</span><span class="p">,</span><span class="w">
    </span><span class="nl">"isStreaming"</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="p">,</span><span class="w">
    </span><span class="nl">"promptTokens"</span><span class="p">:</span><span class="w"> </span><span class="mi">30</span><span class="p">,</span><span class="w">
    </span><span class="nl">"completionTokens"</span><span class="p">:</span><span class="w"> </span><span class="mi">5</span><span class="p">,</span><span class="w">
    </span><span class="nl">"method"</span><span class="p">:</span><span class="w"> </span><span class="s2">"POST"</span><span class="p">,</span><span class="w">
    </span><span class="nl">"path"</span><span class="p">:</span><span class="w"> </span><span class="s2">"/v1/chat/completions"</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>

<p>실측에서 확인한 동작 특성이 하나 있습니다. 429로 거부된 요청은 추론 로그에 남지 않고, 백엔드까지 도달한 요청만 기록됩니다. 거부량까지 집계해야 한다면 알아둘 부분입니다.</p>

<p><img src="/images/blog-514/inference-logs.png" alt="H-MAS 추론 로그" /></p>

<p><em>추론 로그 화면: 이번 실측에서 blog-demo 키로 보낸 요청들의 실제 기록 (상태 코드·TTFB·토큰 표시)</em></p>

<p>화면에 502 한 건이 보이는데, 배포 직후 콜드 스타트 시점에 30초를 기다리다 실패한 요청입니다. 이런 실패 기록도 상태 코드와 함께 로그에 그대로 남아서, 어느 시점에 무슨 요청이 왜 오래 걸렸는지 추적할 수 있습니다.</p>

<p><strong>④ 모니터링 대시보드.</strong> raw /metrics 대신 콘솔에 모니터링 화면이 기본 제공됩니다.</p>

<p><img src="/images/blog-514/monitoring.png" alt="H-MAS 모니터링" /></p>

<p><em>모니터링 화면: blog-qwen 배포에 추론 트래픽을 흘리며 캡처 (TPS·지연·GPU 온도/전력·메트릭 추이·Pod 로그)</em></p>

<hr />

<h2 id="4-3부-비교와-판단">4. 3부: 비교와 판단</h2>

<h3 id="41-단계별-비교">4.1 단계별 비교</h3>

<table>
  <thead>
    <tr>
      <th>단계</th>
      <th>vanilla K8s + vLLM (직접 구축)</th>
      <th>H-MAS (기본 제공)</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>배포 정의</td>
      <td>YAML 78줄 직접 작성 (PVC·shm·probe 포함)</td>
      <td>배포 위자드 폼 입력</td>
    </tr>
    <tr>
      <td>콜드 스타트</td>
      <td>약 6.5분 (다운로드 249초 + 엔진 초기화 84.6초)</td>
      <td>375초 (다운로드 비용은 동일)</td>
    </tr>
    <tr>
      <td>접근 경로</td>
      <td>port-forward 또는 NodePort 직접 관리</td>
      <td>OpenAI 호환 추론 프록시 URL</td>
    </tr>
    <tr>
      <td>인증</td>
      <td>없음 (무인증 호출 200 실측)</td>
      <td>API 키 (무인증 호출 401 실측)</td>
    </tr>
    <tr>
      <td>속도 제한</td>
      <td>없음 (직접 구축 필요)</td>
      <td>키별 RPM (5회 통과 후 429 실측)</td>
    </tr>
    <tr>
      <td>요청 기록</td>
      <td>raw /metrics뿐, 요청자 구분 불가</td>
      <td>요청자·키·토큰·TTFB 단위 추론 로그</td>
    </tr>
    <tr>
      <td>모니터링</td>
      <td>Prometheus/Grafana 직접 구축 필요</td>
      <td>콘솔 대시보드 기본 제공</td>
    </tr>
    <tr>
      <td>클라이언트 코드</td>
      <td>OpenAI SDK 그대로</td>
      <td>OpenAI SDK 그대로 (환경 변수 2개 교체)</td>
    </tr>
  </tbody>
</table>

<h3 id="42-공정하게-말하면">4.2 공정하게 말하면</h3>

<p><strong>모델 1개, 클러스터 1개, 개발·실험 용도라면 vanilla로 충분합니다.</strong> 1부에서 봤듯 매니페스트 하나로 챗봇까지 도달할 수 있고, 그 과정에서 배우는 것도 많습니다. 실제로 이 글의 1부도 목표를 달성했습니다.</p>

<p>갈림길은 그다음에 옵니다. 모델이 여러 개가 되고, 사용자가 여러 명이 되고, 클러스터가 여러 개가 되는 지점부터 “직접 만든 YAML + 무인증 엔드포인트”는 인증 프록시, rate limiter, 사용량 집계, 대시보드를 하나씩 손수 붙여야 하는 프로젝트로 변합니다. H-MAS는 그 부속들을 처음부터 플랫폼에 넣어둔 것입니다.</p>

<h3 id="43-이-글에서-다루지-않은-것">4.3 이 글에서 다루지 않은 것</h3>

<p>이번 실측은 단일 노드·단일 GPU 환경이라 H-MAS의 나머지 축인 멀티 클러스터 통합 관리(여러 클러스터를 하나의 컨트롤 플레인에서 관리하고 배치 정책으로 스케줄링)와 하드웨어 인지 스케줄링(GPU 토폴로지를 인식한 배치)은 다루지 않았습니다. 이 부분은 실측과 함께 다른 글에서 다루겠습니다.</p>

<hr />

<h2 id="5-맺음말">5. 맺음말</h2>

<p>같은 클러스터에서 같은 모델을 두 번 배포해 보며 확인한 것은 단순합니다. 챗봇을 “띄우는” 비용은 두 경로가 비슷하지만, 챗봇을 “여럿이 안전하게 쓰게 만드는” 비용은 크게 다르다는 것입니다.</p>

<p>GPU 서버를 보유하고 있고 AI 모델 서빙에 관심이 있는 조직이라면, 요청 주시는 분께 온라인/오프라인 미팅 또는 제품 소개 자료를 통해 H-MAS를 자세히 안내해 드립니다. 아래 연락처로 편하게 문의해 주세요.</p>

<p><strong>연락처</strong>: <a href="mailto:contact@parameterfreak.com">contact@parameterfreak.com</a></p>]]></content><author><name>{&quot;avatar&quot;=&gt;nil, &quot;name&quot;=&gt;nil, &quot;pronouns&quot;=&gt;nil, &quot;bio&quot;=&gt;nil, &quot;location&quot;=&gt;nil, &quot;employer&quot;=&gt;nil, &quot;uri&quot;=&gt;nil, &quot;email&quot;=&gt;&quot;contact@parameterfreak.com&quot;, &quot;academia&quot;=&gt;nil, &quot;arxiv&quot;=&gt;nil, &quot;googlescholar&quot;=&gt;nil, &quot;inspire-hep&quot;=&gt;nil, &quot;impactstory&quot;=&gt;nil, &quot;orcid&quot;=&gt;nil, &quot;semantic&quot;=&gt;nil, &quot;pubmed&quot;=&gt;nil, &quot;researchgate&quot;=&gt;nil, &quot;scopus&quot;=&gt;nil, &quot;bitbucket&quot;=&gt;nil, &quot;codepen&quot;=&gt;nil, &quot;dribbble&quot;=&gt;nil, &quot;github&quot;=&gt;nil, &quot;kaggle&quot;=&gt;nil, &quot;stackoverflow&quot;=&gt;nil, &quot;artstation&quot;=&gt;nil, &quot;bluesky&quot;=&gt;nil, &quot;facebook&quot;=&gt;nil, &quot;flickr&quot;=&gt;nil, &quot;foursquare&quot;=&gt;nil, &quot;goodreads&quot;=&gt;nil, &quot;google_plus&quot;=&gt;nil, &quot;keybase&quot;=&gt;nil, &quot;instagram&quot;=&gt;nil, &quot;lastfm&quot;=&gt;nil, &quot;linkedin&quot;=&gt;nil, &quot;mastodon&quot;=&gt;nil, &quot;medium&quot;=&gt;nil, &quot;pinterest&quot;=&gt;nil, &quot;soundcloud&quot;=&gt;nil, &quot;steam&quot;=&gt;nil, &quot;telegram&quot;=&gt;nil, &quot;tumblr&quot;=&gt;nil, &quot;twitter&quot;=&gt;nil, &quot;vine&quot;=&gt;nil, &quot;weibo&quot;=&gt;nil, &quot;wikipedia&quot;=&gt;nil, &quot;xing&quot;=&gt;nil, &quot;youtube&quot;=&gt;nil, &quot;zhihu&quot;=&gt;nil}</name><email>contact@parameterfreak.com</email></author><category term="H-MAS" /><category term="MLOps" /><category term="GPU" /><category term="K8s" /><category term="Inference" /><category term="vLLM" /><summary type="html"><![CDATA[이 글의 모든 명령·출력·수치는 2026-07-18, 동일한 클러스터에서 두 경로를 실제로 실행하며 기록한 것입니다.]]></summary></entry><entry><title type="html">H-MAS v0.7.0 release</title><link href="https://parameterfreak.com/posts/2026/07/h-mas-v0.7.0-release/" rel="alternate" type="text/html" title="H-MAS v0.7.0 release" /><published>2026-07-05T03:00:00+00:00</published><updated>2026-07-05T03:00:00+00:00</updated><id>https://parameterfreak.com/posts/2026/07/h-mas-v0.7.0-release</id><content type="html" xml:base="https://parameterfreak.com/posts/2026/07/h-mas-v0.7.0-release/"><![CDATA[<h2 id="h-mas-v070-feature-preview">H-MAS v0.7.0 Feature Preview</h2>

<blockquote>
  <p><strong>“팀 단위로 안전하게 운영한다”</strong></p>
</blockquote>

<p>조직/그룹 멀티테넌시, RBAC, 하드웨어 인지 QoS 스케줄링(xxxxxxxxxxx), 추론 API 인프라를 갖춘 <strong>Feature Preview</strong> 버전입니다.</p>

<h3 id="highlights">Highlights</h3>

<ul>
  <li><strong>멀티테넌시</strong> — Organization/Group 단위 리소스 격리, 멤버십 관리, Cross-Org 접근 전면 차단</li>
  <li><strong>RBAC &amp; 사용자 관리</strong> — 23개 리소스 권한 매트릭스 기반 역할 인가, 사용자 CRUD/프로필/비밀번호 관리</li>
  <li><strong>클러스터 온보딩 정책</strong> — central/delegated 정책으로 클러스터 등록 권한을 조직 관리자에게 위임 가능</li>
  <li><strong>하드웨어 인지 스케줄링</strong> — xxxxxxxxxxx QoS 클래스 자동 주입, 클러스터별 스케줄러 타입 관리, 적용 스케줄러/QoS 가시화</li>
  <li><strong>추론 API 인프라</strong> — OpenAI 호환 프록시, API Key 인증, Redis 기반 Rate Limiting(RPM/TPM), 요청 로깅/뷰어</li>
  <li><strong>HF 토큰 조직 스코핑</strong> — 조직별 HuggingFace 토큰 관리, Gated 모델 배포 사전 차단</li>
  <li><strong>운영 자동화</strong> — 비동기 작업 큐(asynq), xxxxxxx 고아 Work 감지·자동 정리(GC) 및 알림 UI</li>
  <li><strong>보안 CI 파이프라인</strong> — Semgrep, gosec, gitleaks, Trivy, hadolint 도입 및 이미지 스캔 게이트</li>
</ul>

<h3 id="breaking-changes">Breaking Changes</h3>

<ul>
  <li><strong>서빙 런타임 Core 3종 재정비</strong> — Ollama, TGI 런타임 제거. vLLM, llama.cpp, TEI 중심으로 재편 (#299)</li>
  <li><strong>schedulerType enum 변경</strong> — <code class="language-plaintext highlighter-rouge">"default"</code> → <code class="language-plaintext highlighter-rouge">"none"</code> (#307)</li>
  <li><strong>Helm 기본값 변경</strong> — <code class="language-plaintext highlighter-rouge">redis.enabled</code> 기본값 <code class="language-plaintext highlighter-rouge">false</code> → <code class="language-plaintext highlighter-rouge">true</code> (비동기 작업 큐 backing store) (#382)</li>
</ul>

<p>상세 마이그레이션 가이드는 CHANGELOG.md를 참조하세요.</p>

<h3 id="quick-start">Quick Start</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># 자동 설치 (xxxxxxx + H-MAS)</span>
./scripts/install.sh <span class="nt">--registry-token</span> &lt;GHCR-PAT&gt;

<span class="c"># 접속</span>
<span class="c"># 웹 콘솔: http://localhost:30000</span>
<span class="c"># API:     http://localhost:30080</span>
</code></pre></div></div>

<blockquote>
  <p>상세 설치 가이드: INSTALLATION_GUIDE.md
멤버 클러스터 온보딩 가이드: docs/guide/</p>
</blockquote>

<h3 id="docker-images">Docker Images</h3>

<table>
  <thead>
    <tr>
      <th>Image</th>
      <th>Tag</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">ghcr.io/xxxxxxxxxx/hmas-backend</code></td>
      <td><code class="language-plaintext highlighter-rouge">v0.7.0</code>, <code class="language-plaintext highlighter-rouge">latest</code></td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">ghcr.io/xxxxxxxxxx/hmas-frontend</code></td>
      <td><code class="language-plaintext highlighter-rouge">v0.7.0</code>, <code class="language-plaintext highlighter-rouge">latest</code></td>
    </tr>
  </tbody>
</table>

<h3 id="full-changelog">Full Changelog</h3>

<p>전체 변경사항은 CHANGELOG.md를 참조하세요.</p>

<h3 id="개발-히스토리">개발 히스토리</h3>

<p>v0.4.0 릴리즈 이후 v0.7.0까지의 주간 개발 기록입니다.</p>

<table>
  <thead>
    <tr>
      <th>기간</th>
      <th>주요 내용</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><a href="/posts/2026/07/h-mas-weekly-release-notes-0628-0705">2026-06-28 ~ 07-04</a></td>
      <td>v0.7.0 릴리즈 — 클러스터 온보딩/오프보딩 라이프사이클 강건화, GPU 스케줄러 적용 불변식 확립, 알림 벨 통합 (Iteration 29)</td>
    </tr>
    <tr>
      <td><a href="/posts/2026/06/h-mas-weekly-release-notes-0621-0628">2026-06-21 ~ 06-27</a></td>
      <td>고아 Work 자동 감지·정리(GC), 관리 UI, 설정 가능한 클러스터 온보딩 정책 (Iteration 28)</td>
    </tr>
    <tr>
      <td><a href="/posts/2026/06/h-mas-weekly-release-notes-0614-0620">2026-06-14 ~ 06-20</a></td>
      <td>HF 토큰 조직 스코핑, Gated 모델 사전 차단, 비동기 작업 큐 인프라 (Iteration 27)</td>
    </tr>
    <tr>
      <td><a href="/posts/2026/06/h-mas-weekly-release-notes-0607-0613">2026-06-07 ~ 06-13</a></td>
      <td>멀티테넌시 보안 강화(Cross-Org 차단), CI/CD 보안 파이프라인 6종 구축 (Iteration 26)</td>
    </tr>
    <tr>
      <td><a href="/posts/2026/06/h-mas-weekly-release-notes-0531-0606">2026-05-31 ~ 06-06</a></td>
      <td>하드웨어 인지 스케줄러 통합 (설치→QoS→디바이스→API→E2E), 런타임 전략 정비 (Iteration 25)</td>
    </tr>
    <tr>
      <td><a href="/posts/2026/05/h-mas-weekly-release-notes-0524-0530">2026-05-24 ~ 05-30</a></td>
      <td>Organization/Group 멀티테넌시 전 계층 구현, Rate Limit Redis 전환 (Iteration 24)</td>
    </tr>
    <tr>
      <td><a href="/posts/2026/05/h-mas-weekly-release-notes-0517-0523">2026-05-17 ~ 05-23</a></td>
      <td>인증/인가 고도화(API Key·사용자 관리·RBAC), 배포 멀티스텝 위자드, 최적화 프리셋 DB화 (Iteration 23)</td>
    </tr>
    <tr>
      <td><a href="/posts/2026/05/h-mas-weekly-release-notes-0510-0516">2026-05-10 ~ 05-16</a></td>
      <td>추론 API Key 인증, Rate Limiting, 이미지 워머 OOM 수정 (Iteration 22)</td>
    </tr>
    <tr>
      <td><a href="/posts/2026/05/h-mas-weekly-release-notes-0503-0509">2026-05-03 ~ 05-09</a></td>
      <td>추론 요청 로깅 파이프라인, 로그 뷰어·토큰 사용량, 배포 이벤트 히스토리 (Iteration 21)</td>
    </tr>
    <tr>
      <td><a href="/posts/2026/04/h-mas-weekly-release-notes-0426-0502">2026-04-26 ~ 05-02</a></td>
      <td>추론 프록시 Phase 1(통합 엔드포인트), 디자인 시스템 정비, 모델 등록 UX (Iteration 20)</td>
    </tr>
    <tr>
      <td><a href="/posts/2026/04/h-mas-weekly-release-notes-0419-0425/">2026-04-19 ~ 04-25</a></td>
      <td>인플레이스 업데이트 API, Rolling Restart, 파라미터 변경 이력 관리 (Iteration 19)</td>
    </tr>
    <tr>
      <td><a href="/posts/2026/04/h-mas-weekly-release-notes-0412-0418/">2026-04-12 ~ 04-18</a></td>
      <td>서빙 메트릭 수집 파이프라인(Prometheus 실데이터), 배포 일시정지/재시작 (Iteration 18)</td>
    </tr>
    <tr>
      <td><a href="/posts/2026/04/h-mas-weekly-release-notes-0405-0411/">2026-04-05 ~ 04-11</a></td>
      <td>서빙 런타임 이미지 관리(2-Layer Resolution), 멀티클러스터 이미지 사전 캐싱 (Iteration 17)</td>
    </tr>
  </tbody>
</table>]]></content><author><name>{&quot;avatar&quot;=&gt;nil, &quot;name&quot;=&gt;nil, &quot;pronouns&quot;=&gt;nil, &quot;bio&quot;=&gt;nil, &quot;location&quot;=&gt;nil, &quot;employer&quot;=&gt;nil, &quot;uri&quot;=&gt;nil, &quot;email&quot;=&gt;&quot;contact@parameterfreak.com&quot;, &quot;academia&quot;=&gt;nil, &quot;arxiv&quot;=&gt;nil, &quot;googlescholar&quot;=&gt;nil, &quot;inspire-hep&quot;=&gt;nil, &quot;impactstory&quot;=&gt;nil, &quot;orcid&quot;=&gt;nil, &quot;semantic&quot;=&gt;nil, &quot;pubmed&quot;=&gt;nil, &quot;researchgate&quot;=&gt;nil, &quot;scopus&quot;=&gt;nil, &quot;bitbucket&quot;=&gt;nil, &quot;codepen&quot;=&gt;nil, &quot;dribbble&quot;=&gt;nil, &quot;github&quot;=&gt;nil, &quot;kaggle&quot;=&gt;nil, &quot;stackoverflow&quot;=&gt;nil, &quot;artstation&quot;=&gt;nil, &quot;bluesky&quot;=&gt;nil, &quot;facebook&quot;=&gt;nil, &quot;flickr&quot;=&gt;nil, &quot;foursquare&quot;=&gt;nil, &quot;goodreads&quot;=&gt;nil, &quot;google_plus&quot;=&gt;nil, &quot;keybase&quot;=&gt;nil, &quot;instagram&quot;=&gt;nil, &quot;lastfm&quot;=&gt;nil, &quot;linkedin&quot;=&gt;nil, &quot;mastodon&quot;=&gt;nil, &quot;medium&quot;=&gt;nil, &quot;pinterest&quot;=&gt;nil, &quot;soundcloud&quot;=&gt;nil, &quot;steam&quot;=&gt;nil, &quot;telegram&quot;=&gt;nil, &quot;tumblr&quot;=&gt;nil, &quot;twitter&quot;=&gt;nil, &quot;vine&quot;=&gt;nil, &quot;weibo&quot;=&gt;nil, &quot;wikipedia&quot;=&gt;nil, &quot;xing&quot;=&gt;nil, &quot;youtube&quot;=&gt;nil, &quot;zhihu&quot;=&gt;nil}</name><email>contact@parameterfreak.com</email></author><category term="H-MAS" /><category term="MLOps" /><category term="GPU" /><category term="Scheduling" /><category term="K8s" /><category term="Inference" /><summary type="html"><![CDATA[H-MAS v0.7.0 Feature Preview]]></summary></entry><entry><title type="html">AI Weekly Picks(23주차)</title><link href="https://parameterfreak.com/posts/2026/06/ai-weekly-picks-202623/" rel="alternate" type="text/html" title="AI Weekly Picks(23주차)" /><published>2026-06-01T00:00:00+00:00</published><updated>2026-06-01T00:00:00+00:00</updated><id>https://parameterfreak.com/posts/2026/06/ai-weekly-picks</id><content type="html" xml:base="https://parameterfreak.com/posts/2026/06/ai-weekly-picks-202623/"><![CDATA[<h1 id="ai-daily-picks20260602">AI Daily Picks(20260602)</h1>

<ul>
  <li><a href="https://github.com/Tencent/WeKnora/blob/main/README_KO.md">WeKnora — 문서를 살아있는 지식으로: RAG · Agent 추론 · 자동 Wiki 통합 LLM 지식 프레임워크</a>
    <ul>
      <li>엔터프라이즈급 문서 이해, 시맨틱 검색, 자율 추론을 위해 설계된 텐센트의 오픈소스 LLM 기반 지식 프레임워크입니다.</li>
      <li>RAG 기반 Q&amp;A, 복잡한 다단계 작업을 처리하는 ReAct Agent 추론, 원본 문서에서 마크다운 지식베이스와 인터랙티브 지식 그래프를 자동 생성하는 Wiki 모드를 핵심 기능으로 제공합니다.</li>
      <li>다양한 플랫폼(Feishu, Notion 등) 데이터 연동, 20개 이상의 주요 LLM 지원, 세분화된 엔터프라이즈 테넌트 권한 관리(RBAC) 등 실무 환경에 필요한 통합 환경을 제공합니다.</li>
    </ul>
  </li>
  <li><a href="https://outcomeschool.com/blog/llm-routing">LLM Routing</a>
    <ul>
      <li>LLM 라우팅은 사용자의 쿼리를 분석하여 비용, 지연 시간, 품질을 기준으로 가장 적합한 LLM 모델에 요청을 전달하는 시스템입니다.</li>
      <li>단순한 쿼리는 작고 빠른 저비용 LLM에, 복잡한 쿼리는 크고 강력한 고비용 LLM(Frontier LLM)에 할당하여 품질 저하 없이 비용을 크게 절감할 수 있습니다.</li>
      <li>라우팅 전략으로는 규칙 기반(Rule-based), 분류기 기반(Classifier-based), 임베딩 기반(Embedding-based), LLM 기반(LLM-as-Router), 캐스케이드(Cascade) 라우팅 등이 있으며, 이 중 캐스케이드 방식이 가장 비용 효율적입니다.</li>
    </ul>
  </li>
  <li><a href="https://uccl-project.github.io/posts/mkernel/">mKernel: Fast Multi-GPU, Multi-Node Fused Kernels</a>
    <ul>
      <li>mKernel은 노드 내 NVLink 통신, 노드 간 RDMA, 그리고 연산을 단일 영구 커널(persistent kernel) 내에 융합(fuse)한 빠르고 효율적인 멀티 GPU, 멀티 노드 커널 모음입니다.</li>
      <li>기존의 호스트(CPU) 주도형 통신은 통제 오버헤드로 인해 최신 AI 작업에서 파이프라인 버블을 발생시키며 병목 현상의 주요 원인이 되고 있습니다.</li>
      <li>이를 해결하기 위해 mKernel은 GPU 주도형(GPU-driven) 통신 방식을 채택하여, GPU가 직접 세밀한 데이터 전송을 제어하고 통신과 연산을 커널 단위에서 융합함으로써 병렬 처리 효율을 극대화합니다.</li>
    </ul>
  </li>
</ul>

<h1 id="ai-daily-picks20260601">AI Daily Picks(20260601)</h1>

<ul>
  <li><a href="https://mem0.ai/blog/state-of-ai-agent-memory-2026">State of AI Agent Memory 2026: Benchmarks, Architectures &amp; Production Gaps</a>
    <ul>
      <li>AI 에이전트 메모리가 단순한 컨텍스트 확장을 넘어 LoCoMo, LongMemEval, BEAM 같은 표준 벤치마크를 갖춘 독립적인 핵심 아키텍처 요소로 자리 잡았습니다.</li>
      <li>최신 알고리즘은 단일 패스 추출과 다중 신호 검색(시맨틱, 키워드, 엔티티 매칭 결합)을 통해 메모리 성능을 높였으며, 특히 시간적 추론과 멀티홉 추론에서 큰 향상을 보였습니다.</li>
      <li>생태계 내 다양한 프레임워크와 벡터 저장소 연동이 크게 성장했지만, 대규모 시계열 추상화, 교차 세션 신원 확인, 메모리 최신성 유지 등의 해결해야 할 운영 과제들이 여전히 남아 있습니다.</li>
    </ul>
  </li>
</ul>]]></content><author><name>{&quot;avatar&quot;=&gt;nil, &quot;name&quot;=&gt;nil, &quot;pronouns&quot;=&gt;nil, &quot;bio&quot;=&gt;nil, &quot;location&quot;=&gt;nil, &quot;employer&quot;=&gt;nil, &quot;uri&quot;=&gt;nil, &quot;email&quot;=&gt;&quot;contact@parameterfreak.com&quot;, &quot;academia&quot;=&gt;nil, &quot;arxiv&quot;=&gt;nil, &quot;googlescholar&quot;=&gt;nil, &quot;inspire-hep&quot;=&gt;nil, &quot;impactstory&quot;=&gt;nil, &quot;orcid&quot;=&gt;nil, &quot;semantic&quot;=&gt;nil, &quot;pubmed&quot;=&gt;nil, &quot;researchgate&quot;=&gt;nil, &quot;scopus&quot;=&gt;nil, &quot;bitbucket&quot;=&gt;nil, &quot;codepen&quot;=&gt;nil, &quot;dribbble&quot;=&gt;nil, &quot;github&quot;=&gt;nil, &quot;kaggle&quot;=&gt;nil, &quot;stackoverflow&quot;=&gt;nil, &quot;artstation&quot;=&gt;nil, &quot;bluesky&quot;=&gt;nil, &quot;facebook&quot;=&gt;nil, &quot;flickr&quot;=&gt;nil, &quot;foursquare&quot;=&gt;nil, &quot;goodreads&quot;=&gt;nil, &quot;google_plus&quot;=&gt;nil, &quot;keybase&quot;=&gt;nil, &quot;instagram&quot;=&gt;nil, &quot;lastfm&quot;=&gt;nil, &quot;linkedin&quot;=&gt;nil, &quot;mastodon&quot;=&gt;nil, &quot;medium&quot;=&gt;nil, &quot;pinterest&quot;=&gt;nil, &quot;soundcloud&quot;=&gt;nil, &quot;steam&quot;=&gt;nil, &quot;telegram&quot;=&gt;nil, &quot;tumblr&quot;=&gt;nil, &quot;twitter&quot;=&gt;nil, &quot;vine&quot;=&gt;nil, &quot;weibo&quot;=&gt;nil, &quot;wikipedia&quot;=&gt;nil, &quot;xing&quot;=&gt;nil, &quot;youtube&quot;=&gt;nil, &quot;zhihu&quot;=&gt;nil}</name><email>contact@parameterfreak.com</email></author><category term="Misc" /><category term="AI" /><category term="News" /><category term="Reference" /><summary type="html"><![CDATA[AI Daily Picks(20260602)]]></summary></entry><entry><title type="html">AI Weekly Picks(20주차)</title><link href="https://parameterfreak.com/posts/2026/05/ai-weekly-picks-202620/" rel="alternate" type="text/html" title="AI Weekly Picks(20주차)" /><published>2026-05-13T00:00:00+00:00</published><updated>2026-05-13T00:00:00+00:00</updated><id>https://parameterfreak.com/posts/2026/05/ai-weekly-picks</id><content type="html" xml:base="https://parameterfreak.com/posts/2026/05/ai-weekly-picks-202620/"><![CDATA[<h1 id="ai-daily-picks20260515">AI Daily Picks(20260515)</h1>

<ul>
  <li><a href="https://kyunghyuncho.me/teaching-fundamentals-of-machine-learning/">Teaching ‘Fundamentals of Machine Learning’ - Kyunghyun Cho</a>
    <ul>
      <li>코딩 어시스턴트(AI 툴)를 적극 활용하여 ‘Fundamentals of Machine Learning’ 수업 방식을 전면 개편한 교수의 경험담.</li>
      <li>기존의 빈칸 채우기 식 실습에서 벗어나, 매주 배운 ML 개념을 바탕으로 밑바닥부터 완전한 웹 앱을 ‘바이브 코딩(vibe-coding)’하는 방식으로 수업을 진행함.</li>
      <li>학생들에게 자유도를 주고 스스로 AI 도구를 활용해 프로젝트를 완성하게 함으로써, 학생들의 창의성과 문제 해결 능력이 크게 향상됨을 관찰함.</li>
    </ul>
  </li>
  <li><a href="https://unsloth.ai/blog/nvidia-collab">How to Make LLM Training Faster with Unsloth and NVIDIA</a>
    <ul>
      <li>NVIDIA와의 협업을 통해 Unsloth의 LLM 파인튜닝 속도를 정확도 손실 없이 기존 대비 약 25% 추가 향상시킴.</li>
      <li>반복되는 Packed Sequence 메타데이터를 매 레이어마다 재생성하지 않고 캐싱하여 재사용함으로써 14.3%의 속도 향상을 얻음.</li>
      <li>그래픽 메모리와 시스템 메모리 간의 Activation 복사와 역전파 연산을 중첩(Double Buffered Async Gradient Checkpointing)시켜 8%의 속도 향상을 달성함.</li>
      <li>MoE 라우팅 시 동적 쿼리(<code class="language-plaintext highlighter-rouge">torch.where</code>) 대신 <code class="language-plaintext highlighter-rouge">argsort</code>와 <code class="language-plaintext highlighter-rouge">bincount</code>를 활용해 연산을 한 번에 묶어서 처리함으로써 GPT-OSS 학습 속도를 15% 단축함.</li>
    </ul>
  </li>
  <li><a href="https://lightseek.org/blog/lightseek-tokenspeed.html">TokenSpeed: A Speed-of-Light LLM Inference Engine for Agentic Workloads</a>
    <ul>
      <li>에이전틱(Agentic) 워크로드에 최적화된 새로운 초고속 LLM 추론 엔진인 TokenSpeed 발표 (LightSeek Foundation, NVIDIA, AMD 등 공동 개발).</li>
      <li>Control Plane(상태 머신, 자원 관리)과 Execution Plane을 분리한 고성능 스케줄러 및 자동화된 모델링 병렬화 메커니즘을 도입함.</li>
      <li>Tensor Core 활용도를 극대화한 자체 최적화 커널(TokenSpeed MLA 등)을 적용해, 에이전트 환경에서 TensorRT-LLM 대비 더 높은 처리량(TPM)과 더 낮은 지연 시간(TPS)을 달성함.</li>
    </ul>
  </li>
  <li><a href="https://netflixtechblog.com/state-of-routing-in-model-serving-16e22fe18741">State of Routing in Model Serving - Netflix TechBlog</a>
    <ul>
      <li>Netflix에서 초당 100만 건 이상의 요청을 처리하기 위해 구축한 중앙 집중식 ML 모델 서빙 플랫폼의 아키텍처 진화 과정 소개.</li>
      <li>초기에는 ‘Switchboard’라는 중앙 프록시를 통해 컨텍스트 기반 라우팅과 A/B 테스트를 처리했으나, 단일 장애점(SPOF) 문제와 네트워크 지연이 발생함.</li>
      <li>이를 해결하기 위해 라우팅 정보 리졸브(Lightbulb)와 실제 트래픽 라우팅(Envoy proxy) 계층을 분리하는 구조로 개편하여, 안정성과 성능을 개선함.</li>
    </ul>
  </li>
</ul>

<h1 id="ai-daily-picks20260513">AI Daily Picks(20260513)</h1>

<ul>
  <li><a href="https://modal.com/blog/truly-serverless-gpus">How to achieve truly serverless GPUs</a>
    <ul>
      <li>GPU 인퍼런스 환경의 콜드 스타트를 수십 분에서 수십 초 단위로 단축하여 낭비 없는(Serverless) 리소스 할당을 달성한 엔지니어링 4단계 핵심 요소를 설명함.</li>
      <li><strong>클라우드 버퍼 (Cloud buffers):</strong> 건강한 유휴 GPU 버퍼를 미리 유지하여 새로운 인스턴스 할당과 헬스 체크에 소요되는 수십 분의 지연 시간을 제거함.</li>
      <li><strong>커스텀 파일 시스템 (ImageFS):</strong> libfuse를 기반으로 티어 구조의 캐시를 구현하여 전체 이미지 로드 없이 컨테이너 실행에 필요한 파일만 지연 로딩(Lazy Loading)함으로써 컨테이너 시작 시간을 단축함.</li>
      <li><strong>호스트 및 디바이스 메모리 스냅샷 (Checkpoint/Restore):</strong> gVisor(runsc)를 활용해 프로세스 메모리 상태(Host)를 복원하고, Nvidia 드라이버 기능으로 GPU 메모리(Device)까지 체크포인트 및 복원하여 런타임 초기화와 가중치 로드 시간을 획기적으로 줄임.</li>
    </ul>
  </li>
  <li><a href="https://outcomeschool.com/blog/agentic-rag">Agentic RAG</a>
    <ul>
      <li>단순 정보 검색 후 생성을 수행하는 기존 RAG의 한계를 극복하기 위해, AI Agent가 검색의 전 과정을 주도하는 Agentic RAG 개념과 워크플로우를 소개함.</li>
      <li>기존 RAG는 한 번의 검색만 수행하여 복잡한 다중 홉(multi-hop) 질문이나 모호한 쿼리 처리에 취약하지만, Agentic RAG는 Agent, 도구(Tools), 루프(Loop)를 활용해 목표 달성 시까지 검색과 평가를 반복함.</li>
      <li>대표적인 패턴으로 ReAct, Self-RAG, Corrective RAG(CRAG)가 있으며, 복잡한 쿼리와 다중 데이터 소스 환경에서 뛰어난 성능을 보이나 지연 시간과 비용 증가를 고려해야 함.</li>
    </ul>
  </li>
</ul>]]></content><author><name>{&quot;avatar&quot;=&gt;nil, &quot;name&quot;=&gt;nil, &quot;pronouns&quot;=&gt;nil, &quot;bio&quot;=&gt;nil, &quot;location&quot;=&gt;nil, &quot;employer&quot;=&gt;nil, &quot;uri&quot;=&gt;nil, &quot;email&quot;=&gt;&quot;contact@parameterfreak.com&quot;, &quot;academia&quot;=&gt;nil, &quot;arxiv&quot;=&gt;nil, &quot;googlescholar&quot;=&gt;nil, &quot;inspire-hep&quot;=&gt;nil, &quot;impactstory&quot;=&gt;nil, &quot;orcid&quot;=&gt;nil, &quot;semantic&quot;=&gt;nil, &quot;pubmed&quot;=&gt;nil, &quot;researchgate&quot;=&gt;nil, &quot;scopus&quot;=&gt;nil, &quot;bitbucket&quot;=&gt;nil, &quot;codepen&quot;=&gt;nil, &quot;dribbble&quot;=&gt;nil, &quot;github&quot;=&gt;nil, &quot;kaggle&quot;=&gt;nil, &quot;stackoverflow&quot;=&gt;nil, &quot;artstation&quot;=&gt;nil, &quot;bluesky&quot;=&gt;nil, &quot;facebook&quot;=&gt;nil, &quot;flickr&quot;=&gt;nil, &quot;foursquare&quot;=&gt;nil, &quot;goodreads&quot;=&gt;nil, &quot;google_plus&quot;=&gt;nil, &quot;keybase&quot;=&gt;nil, &quot;instagram&quot;=&gt;nil, &quot;lastfm&quot;=&gt;nil, &quot;linkedin&quot;=&gt;nil, &quot;mastodon&quot;=&gt;nil, &quot;medium&quot;=&gt;nil, &quot;pinterest&quot;=&gt;nil, &quot;soundcloud&quot;=&gt;nil, &quot;steam&quot;=&gt;nil, &quot;telegram&quot;=&gt;nil, &quot;tumblr&quot;=&gt;nil, &quot;twitter&quot;=&gt;nil, &quot;vine&quot;=&gt;nil, &quot;weibo&quot;=&gt;nil, &quot;wikipedia&quot;=&gt;nil, &quot;xing&quot;=&gt;nil, &quot;youtube&quot;=&gt;nil, &quot;zhihu&quot;=&gt;nil}</name><email>contact@parameterfreak.com</email></author><category term="Misc" /><category term="AI" /><category term="News" /><category term="Reference" /><summary type="html"><![CDATA[AI Daily Picks(20260515)]]></summary></entry><entry><title type="html">AI Weekly Picks(19주차)</title><link href="https://parameterfreak.com/posts/2026/05/ai-weekly-picks-202619/" rel="alternate" type="text/html" title="AI Weekly Picks(19주차)" /><published>2026-05-06T00:00:00+00:00</published><updated>2026-05-06T00:00:00+00:00</updated><id>https://parameterfreak.com/posts/2026/05/ai-weekly-picks</id><content type="html" xml:base="https://parameterfreak.com/posts/2026/05/ai-weekly-picks-202619/"><![CDATA[<h1 id="ai-daily-picks20260506">AI Daily Picks(20260506)</h1>

<ul>
  <li><a href="https://www.spheron.network/blog/kv-cache-optimization-guide/">KV Cache Optimization: Serve 10x More Users on the Same GPU (2026) - Spheron Blog</a>
    <ul>
      <li>LLM 추론 시 긴 컨텍스트에서 발생하는 가장 큰 GPU 메모리 병목인 KV 캐시를 최적화하는 5가지 핵심 기법을 소개합니다.</li>
      <li>PagedAttention(가상 메모리처럼 필요시 할당), FP8/NVFP4 양자화(메모리 사용량 절감), CPU 오프로딩(트래픽 스파이크 대응), LMCache 및 프리픽스 캐싱(TTFT 단축), GQA/Flash Attention 같은 아키텍처 수준의 최적화 기법들을 다룹니다.</li>
      <li>이러한 기법들을 복합적으로 적용하여 동일한 GPU에서 수용 가능한 동시 사용자를 늘리고, 워크로드에 맞게 최적화된 GPU VRAM 예산을 산정할 수 있습니다.</li>
    </ul>
  </li>
  <li><a href="https://pr-peri.github.io/blogpost/2026/03/25/blogpost-llm-quantization-kv-cache.html">LLM Inference Optimization: Quantization, KV Cache, and Serving at Scale - Perivitta Rajendran</a>
    <ul>
      <li>프로덕션 환경에서 LLM 추론 시 발생하는 메모리 및 연산 병목을 해결하기 위한 최적화 기법들을 심도 있게 다룹니다.</li>
      <li>주요 기법으로 가중치와 KV 캐시의 메모리 사용량을 4~8배 줄이는 양자화(GPTQ, AWQ), 처리량을 10~20배 높이는 연속 배치(Continuous Batching), 지연 시간을 2~3배 단축하는 추측 해독(Speculative Decoding)을 설명합니다.</li>
      <li>이러한 최적화 기술들이 내장된 vLLM, TGI와 같은 최신 서빙 프레임워크와 Flash Attention, 텐서 병렬 처리(Tensor Parallelism)를 활용한 효율적인 대규모 인퍼런스 구축 방법을 제공합니다.</li>
    </ul>
  </li>
</ul>]]></content><author><name>{&quot;avatar&quot;=&gt;nil, &quot;name&quot;=&gt;nil, &quot;pronouns&quot;=&gt;nil, &quot;bio&quot;=&gt;nil, &quot;location&quot;=&gt;nil, &quot;employer&quot;=&gt;nil, &quot;uri&quot;=&gt;nil, &quot;email&quot;=&gt;&quot;contact@parameterfreak.com&quot;, &quot;academia&quot;=&gt;nil, &quot;arxiv&quot;=&gt;nil, &quot;googlescholar&quot;=&gt;nil, &quot;inspire-hep&quot;=&gt;nil, &quot;impactstory&quot;=&gt;nil, &quot;orcid&quot;=&gt;nil, &quot;semantic&quot;=&gt;nil, &quot;pubmed&quot;=&gt;nil, &quot;researchgate&quot;=&gt;nil, &quot;scopus&quot;=&gt;nil, &quot;bitbucket&quot;=&gt;nil, &quot;codepen&quot;=&gt;nil, &quot;dribbble&quot;=&gt;nil, &quot;github&quot;=&gt;nil, &quot;kaggle&quot;=&gt;nil, &quot;stackoverflow&quot;=&gt;nil, &quot;artstation&quot;=&gt;nil, &quot;bluesky&quot;=&gt;nil, &quot;facebook&quot;=&gt;nil, &quot;flickr&quot;=&gt;nil, &quot;foursquare&quot;=&gt;nil, &quot;goodreads&quot;=&gt;nil, &quot;google_plus&quot;=&gt;nil, &quot;keybase&quot;=&gt;nil, &quot;instagram&quot;=&gt;nil, &quot;lastfm&quot;=&gt;nil, &quot;linkedin&quot;=&gt;nil, &quot;mastodon&quot;=&gt;nil, &quot;medium&quot;=&gt;nil, &quot;pinterest&quot;=&gt;nil, &quot;soundcloud&quot;=&gt;nil, &quot;steam&quot;=&gt;nil, &quot;telegram&quot;=&gt;nil, &quot;tumblr&quot;=&gt;nil, &quot;twitter&quot;=&gt;nil, &quot;vine&quot;=&gt;nil, &quot;weibo&quot;=&gt;nil, &quot;wikipedia&quot;=&gt;nil, &quot;xing&quot;=&gt;nil, &quot;youtube&quot;=&gt;nil, &quot;zhihu&quot;=&gt;nil}</name><email>contact@parameterfreak.com</email></author><category term="Misc" /><category term="AI" /><category term="News" /><category term="Reference" /><summary type="html"><![CDATA[AI Daily Picks(20260506)]]></summary></entry><entry><title type="html">AI Weekly Picks(18주차)</title><link href="https://parameterfreak.com/posts/2026/04/ai-weekly-picks-202618/" rel="alternate" type="text/html" title="AI Weekly Picks(18주차)" /><published>2026-04-27T00:00:00+00:00</published><updated>2026-04-27T00:00:00+00:00</updated><id>https://parameterfreak.com/posts/2026/04/ai-weekly-picks</id><content type="html" xml:base="https://parameterfreak.com/posts/2026/04/ai-weekly-picks-202618/"><![CDATA[<h1 id="ai-daily-picks20260430">AI Daily Picks(20260430)</h1>

<ul>
  <li><a href="https://github.com/gauravfs-14/awesome-jepa">GitHub - gauravfs-14/awesome-jepa</a>
    <ul>
      <li>Yann LeCun과 Meta AI가 제안한 자가지도 학습(Self-supervised learning) 패러다임인 JEPA(Joint Embedding Predictive Architecture) 관련 자료를 모아둔 큐레이션 저장소입니다.</li>
      <li>픽셀이나 토큰을 재구성하지 않고 미래의 추상적 표현을 예측하여 학습하는 JEPA의 핵심 개념을 기반으로 한 도구, 라이브러리, 연구 논문, 튜토리얼 등을 종합적으로 제공합니다.</li>
      <li>비전, 언어, 의료, 물리, 시계열 등 다양한 도메인에 적용된 최신 연구와 응용 사례들을 꾸준히 업데이트하여 연구자들에게 유용한 지식 허브 역할을 합니다.</li>
    </ul>
  </li>
  <li><a href="https://pub.sakana.ai/kame/">KAME: Tandem Architecture for Enhancing Knowledge in Real-Time Speech-to-Speech Conversational AI</a>
    <ul>
      <li>실시간 Speech-to-Speech(S2S) 모델의 빠른 응답성과 백엔드 LLM의 풍부한 지식을 결합한 KAME 아키텍처를 제안했습니다.</li>
      <li>S2S 모델이 즉각적으로 응답을 시작하는 동시에 백엔드 LLM이 병렬로 실행되며 지식 신호를 비동기적으로 주입하는 “말하면서 생각하기” 패러다임을 구현했습니다.</li>
      <li>작업에 따라 백엔드 LLM(gpt-4.1, claude-opus-4-1 등)을 유연하게 교체할 수 있어, 낮은 지연 시간을 유지하면서도 전문적이고 풍부한 응답을 제공합니다.</li>
    </ul>
  </li>
  <li><a href="https://www.lmsys.org/blog/2026-04-29-p2p-update/">Updating 1T parameters in seconds - P2P weight transfer in Large Scale Distributed RL</a>
    <ul>
      <li>대규모 분산 RL(강화학습) 환경에서 SGLang을 위한 RDMA 기반의 P2P(Peer-to-Peer) 가중치 업데이트 메커니즘을 도입하여 기존 NCCL 브로드캐스트의 한계를 극복했습니다.</li>
      <li>소스 측 CPU 엔진 복제본과 Mooncake TransferEngine을 활용하여 1T 파라미터(Kimi-K2) 모델의 가중치 전송 시간을 53초에서 7.2초로 7배 단축했습니다.</li>
      <li>기존의 중앙 집중식 브로드캐스트에서 벗어나 트레이너와 추론 랭크 간의 독립적이고 병렬적인 P2P 매핑 및 Zero-Copy 전송을 구현하여 네트워크 중복을 줄이고 대역폭 활용도를 크게 높였습니다.</li>
    </ul>
  </li>
</ul>

<h1 id="ai-daily-picks20260428">AI Daily Picks(20260428)</h1>

<ul>
  <li><a href="https://techcommunity.microsoft.com/blog/azure-ai-foundry-blog/whats-new-in-foundry-labs---april-2026/4509714">What’s new in Foundry Labs - April 2026 - Microsoft Community Hub</a>
    <ul>
      <li><strong>MAI-Transcribe-1, Voice-1, Image-2</strong>: 마이크로소프트의 자체 개발 AI 스택으로, 높은 정확도의 음성 인식/생성 및 텍스트-이미지 생성 모델 공개.</li>
      <li><strong>Harrier-oss-v1</strong>: 94개 언어를 지원하며 지시어 기반(instruction-tuned) 맞춤 설정이 가능한 오픈소스 다국어 텍스트 임베딩 모델(270M, 0.6B, 27B).</li>
      <li><strong>Phi-4-Reasoning-Vision-15B</strong>: 15B의 컴팩트한 크기에도 차트, 수식, GUI 화면 등을 이해하고 구조화된 추론을 할 수 있는 소형 비전 추론 모델.</li>
      <li><strong>VibeVoice ASR &amp; GigaTIME</strong>: 최대 60분 오디오의 다중 화자 음성 인식과 화자 분리를 한 번에 처리하는 VibeVoice ASR, 그리고 저비용 병리 슬라이드를 고해상도 이미지로 변환해 종양 면역 미세환경 분석을 돕는 GigaTIME 모델 소개.</li>
    </ul>
  </li>
</ul>

<h1 id="ai-daily-picks20260427">AI Daily Picks(20260427)</h1>

<ul>
  <li><a href="https://msftnewsnow.com/microsoft-open-sources-harrier-embedding-model">Microsoft Open-Sources Harrier, A New Embedding Blockbuster Model For The Agentic Web</a>
    <ul>
      <li>마이크로소프트가 다국어 MTEB v2 벤치마크에서 최고 성능을 달성한 새로운 임베딩 모델 제품군인 Harrier-OSS-v1을 오픈소스로 공개했습니다.</li>
      <li>기존 BERT 방식이 아닌 디코더 전용 트랜스포머 아키텍처를 채택하여 최대 32,768 토큰의 긴 문맥을 청킹 없이 네이티브로 처리할 수 있습니다.</li>
      <li>27B 플래그십 모델부터 0.6B, 270M 파라미터의 경량 모델까지 제공되며, RAG 시스템 및 다국어 지원 에이전트 구축에 최적화되어 있습니다.</li>
    </ul>
  </li>
</ul>]]></content><author><name>{&quot;avatar&quot;=&gt;nil, &quot;name&quot;=&gt;nil, &quot;pronouns&quot;=&gt;nil, &quot;bio&quot;=&gt;nil, &quot;location&quot;=&gt;nil, &quot;employer&quot;=&gt;nil, &quot;uri&quot;=&gt;nil, &quot;email&quot;=&gt;&quot;contact@parameterfreak.com&quot;, &quot;academia&quot;=&gt;nil, &quot;arxiv&quot;=&gt;nil, &quot;googlescholar&quot;=&gt;nil, &quot;inspire-hep&quot;=&gt;nil, &quot;impactstory&quot;=&gt;nil, &quot;orcid&quot;=&gt;nil, &quot;semantic&quot;=&gt;nil, &quot;pubmed&quot;=&gt;nil, &quot;researchgate&quot;=&gt;nil, &quot;scopus&quot;=&gt;nil, &quot;bitbucket&quot;=&gt;nil, &quot;codepen&quot;=&gt;nil, &quot;dribbble&quot;=&gt;nil, &quot;github&quot;=&gt;nil, &quot;kaggle&quot;=&gt;nil, &quot;stackoverflow&quot;=&gt;nil, &quot;artstation&quot;=&gt;nil, &quot;bluesky&quot;=&gt;nil, &quot;facebook&quot;=&gt;nil, &quot;flickr&quot;=&gt;nil, &quot;foursquare&quot;=&gt;nil, &quot;goodreads&quot;=&gt;nil, &quot;google_plus&quot;=&gt;nil, &quot;keybase&quot;=&gt;nil, &quot;instagram&quot;=&gt;nil, &quot;lastfm&quot;=&gt;nil, &quot;linkedin&quot;=&gt;nil, &quot;mastodon&quot;=&gt;nil, &quot;medium&quot;=&gt;nil, &quot;pinterest&quot;=&gt;nil, &quot;soundcloud&quot;=&gt;nil, &quot;steam&quot;=&gt;nil, &quot;telegram&quot;=&gt;nil, &quot;tumblr&quot;=&gt;nil, &quot;twitter&quot;=&gt;nil, &quot;vine&quot;=&gt;nil, &quot;weibo&quot;=&gt;nil, &quot;wikipedia&quot;=&gt;nil, &quot;xing&quot;=&gt;nil, &quot;youtube&quot;=&gt;nil, &quot;zhihu&quot;=&gt;nil}</name><email>contact@parameterfreak.com</email></author><category term="Misc" /><category term="AI" /><category term="News" /><category term="Reference" /><summary type="html"><![CDATA[AI Daily Picks(20260430)]]></summary></entry><entry><title type="html">AI Weekly Picks(17주차)</title><link href="https://parameterfreak.com/posts/2026/04/ai-weekly-picks-202617/" rel="alternate" type="text/html" title="AI Weekly Picks(17주차)" /><published>2026-04-21T00:00:00+00:00</published><updated>2026-04-21T00:00:00+00:00</updated><id>https://parameterfreak.com/posts/2026/04/ai-weekly-picks</id><content type="html" xml:base="https://parameterfreak.com/posts/2026/04/ai-weekly-picks-202617/"><![CDATA[<h1 id="ai-daily-picks20260423">AI Daily Picks(20260423)</h1>

<ul>
  <li><a href="https://llm-d.ai/blog/production-grade-llm-inference-at-scale-kserve-llm-d-vllm">Production-Grade LLM Inference at Scale with KServe, llm-d, and vLLM</a>
    <ul>
      <li>수백 개의 대형 언어 모델(LLM)을 스케일링하고 관리하는 과정에서 기존 vLLM의 단순 배포 방식이 가진 스토리지 지연, 인프라 종속성, 비효율적 로드 밸런싱 문제를 KServe, llm-d, vLLM 조합으로 해결한 사례를 공유합니다.</li>
      <li>KServe의 LLMInferenceService를 통해 표준 Kubernetes API 수준에서 vLLM 설정을 정밀하게 커스터마이징하여 하드웨어 특성에 맞는 유연한 배포를 가능하게 했습니다.</li>
      <li>Envoy 및 Gateway API Inference Extension을 활용한 접두어 캐시 인식 라우팅(prefix-cache aware routing)을 적용하여 GPU 효율성을 극대화했으며, 실제 Llama 3.1 70B 모델 배포에서 출력 토큰 생성 속도를 3배, 첫 토큰 응답 시간(TTFT)을 절반으로 단축하는 성과를 얻었습니다.</li>
    </ul>
  </li>
  <li><a href="https://pureai.com/articles/2026/04/09/microsoft-open-sources-embedding-models-to-improve-ai-data-retrieval.aspx">Microsoft Open-Sources Embedding Models to Improve AI Data Retrieval</a>
    <ul>
      <li>마이크로소프트가 단순한 키워드 매칭을 넘어 의미론적 연관성을 파악해 검색, 추천 및 데이터 검색 시스템의 기반을 이루는 새로운 AI 임베딩 모델 제품군(Harrier)을 오픈소스로 공개했습니다.</li>
      <li>엔터프라이즈 AI가 실험 단계에서 실제 운영 환경으로 전환됨에 따라, 생성된 결과물의 정교함보다 검증된 실제 데이터에 기반하여 환각(오류)을 줄이고 신뢰성을 높이는 검색 증강 생성(RAG) 및 에이전트 시스템의 중요성이 커지고 있습니다.</li>
      <li>100개 이상의 언어를 지원하고 다양한 환경에서 구동 가능한 이 고성능 임베딩 모델의 오픈소스화는, 개발자들이 폭넓은 애플리케이션에 이를 쉽게 통합할 수 있게 함으로써 기업의 내부 검색 도구 강화 및 AI 어시스턴트 성능 향상에 실질적으로 기여할 것으로 기대됩니다.</li>
    </ul>
  </li>
</ul>

<h1 id="ai-daily-picks20260422">AI Daily Picks(20260422)</h1>

<ul>
  <li><a href="https://kempnerinstitute.harvard.edu/research/deeper-learning/from-models-to-scientists-building-ai-agents-for-scientific-discovery">From Models to Scientists: Building AI Agents for Scientific Discovery - Kempner Institute</a>
    <ul>
      <li>하버드 Kempner Institute에서 개발한 <strong>ToolUniverse</strong>는 대규모 언어 모델(LLM)이 600개 이상의 과학 도구(머신러닝 모델, DB, 시뮬레이터 등)를 활용해 연구를 기획하고 수행할 수 있게 해주는 AI 과학자 에이전트 구축 프레임워크입니다.</li>
      <li>4가지 핵심 컴포넌트(Manager, Composer, Discover, Optimizer)를 제공하여, 단순한 도구 호출(MCP)을 넘어 다단계 과학적 추론과 워크플로우를 실행하고 새로운 도구를 자율적으로 생성 및 최적화할 수 있도록 지원합니다.</li>
      <li>실제 사례로 AI 에이전트가 단백질 타겟 탐색부터 화합물 식별, 구조 최적화 및 특허 검증에 이르는 약물 발견의 전 과정을 시뮬레이션하여 인간 연구자의 강력한 협력자(Co-scientist)로 활용될 수 있음을 보여주었습니다.</li>
    </ul>
  </li>
</ul>

<h1 id="ai-daily-picks20260421">AI Daily Picks(20260421)</h1>

<ul>
  <li><a href="https://ai-beat.github.io/news/2026/03/harrier-oss-multilingual-embeddings/">Microsoft’s Harrier Embeds 32K Tokens at Once - AI Beat</a>
    <ul>
      <li>최대 32,768 토큰(기존 대비 30~60배)의 컨텍스트 윈도우를 지원하는 디코더 전용 다국어 임베딩 모델 제품군(Harrier-OSS-v1: 270M, 0.6B, 27B)이 MIT 라이선스로 오픈소스 공개되었습니다.</li>
      <li>27B 모델은 다국어 MTEB v2 벤치마크에서 74.3점으로 최고 성능(SOTA)을 달성했으며, 문서를 청킹하지 않고 전체 논문이나 계약서를 한 번에 임베딩할 수 있어 RAG(검색 증강 생성) 시스템의 설계에 변화를 줄 수 있습니다.</li>
      <li>디코더 전용 구조(마지막 토큰 풀링 방식)를 채택하여 강력한 성능을 발휘하지만, 양방향 인코더 방식에 비해 추론 비용(Inference cost)이 증가한다는 단점이 있으며 27B 모델은 전용 GPU 인프라를 요구합니다.</li>
    </ul>
  </li>
  <li><a href="https://mitsloan.mit.edu/ideas-made-to-matter/ai-agents-tech-circularity-whats-ahead-platforms-2026">AI agents, tech circularity: What’s ahead for platforms in 2026 - MIT Sloan</a>
    <ul>
      <li>플랫폼 시장 환경은 자율적인 AI 에이전트의 등장에 대비해 에이전트 전용 인터페이스와 통제 규칙을 마련하는 방향으로 변화하고 있습니다.</li>
      <li>생성형 AI의 활발한 도입은 코딩 생산성을 높였으나 최신 시스템에서는 관리가 어려운 불완전한 코드가 축적되는 “기술 부채 폭증(turbocharged technical debt)” 리스크를 발생시키고 있습니다.</li>
      <li>AI 스택의 소수 빅테크 의존 심화 문제에 대응하기 위해 신중한 AI 툴 도입이 필요하며, 나아가 디지털 플랫폼 전략이 하드웨어 재활용 및 재판매를 통한 순환 경제(circular economy) 영역까지 확장되고 있습니다.</li>
    </ul>
  </li>
  <li><a href="https://www.kriraai.com/blog/turboquant-kv-cache-compression-changes-llm-inference">TurboQuant KV Cache Compression: What Changes for LLM Inference</a>
    <ul>
      <li>별도의 재학습 없이(training-free) LLM의 KV 캐시 메모리 사용량을 최대 6배 줄여주는 구글의 압축 기술 ‘TurboQuant’를 분석한 글로, 장문 컨텍스트 추론의 핵심 병목인 VRAM 한계를 획기적으로 극복할 수 있습니다.</li>
      <li>극심한 비대칭성 문제를 지닌 캐시 값 분포를 ‘PolarQuant’ 단계의 직교 회전(Orthogonal rotation)으로 균일화하여 양자화 효율을 극대화하며, 실제 구현 시에는 논문상의 QJL 잔차 교정 대신 보편적인 MSE 전용 양자화(MSE-only quantization)를 사용하는 것이 성능 면에서 우수한 것으로 입증되었습니다.</li>
      <li>기존 파라미터 양자화(AWQ 등)와 동시 적용이 가능한 상호보완적 기술로서, 향후 프레임워크 지원이 완료되면 다중 접속 및 장문 입력이 필요한 에이전트/RAG 기반 기업용 AI 환경의 인프라 효율성을 극대화할 것입니다.</li>
    </ul>
  </li>
  <li>
    <ul>
      <li>LLM 텍스트 생성 시 이전 토큰에 대한 중복 연산을 방지해주는 ‘KV Cache(Key-Value Cache)’ 메커니즘의 원리를 설명한 상세 가이드입니다.</li>
      <li>계산 속도를 O(1) 수준으로 높이는 대신 GPU의 VRAM 메모리 소모가 컨텍스트 길이에 비례해 선형적으로 증가하며, 결국 메모리 관리(Memory bottleneck)가 실제 운영 및 배포 단계에서 가장 중요한 과제가 됨을 강조합니다.</li>
      <li>메모리 한계 부딪힘을 극복하기 위한 대표적 최적화 기술로 PagedAttention(메모리 파편화 방지), GQA(멀티 쿼리 헤드의 KV 헤드 공유), KV Cache Quantization(데이터 정밀도 축소) 등을 소개하고 활용을 권장합니다.</li>
    </ul>
  </li>
  <li><a href="https://mlhive.com/2026/04/microsoft-harrier-open-source-embedding-models-rag">Microsoft Harrier Disrupts the AI Landscape Dethroning Proprietary Embedding Models — ML Hive</a>
    <ul>
      <li>마이크로소프트가 상용 임베딩 모델(OpenAI, Google)의 성능을 능가하는 최대 27B 파라미터 규모의 다국어 오픈소스 임베딩 모델군 ‘Harrier’를 공개하여 기업용 RAG 구조의 혁신을 주도하고 있습니다.</li>
      <li>초거대 파라미터를 기반으로 단어 구분의 혼동(Semantic crowding) 문제를 해결함으로써 컨텍스트의 미세한 차이를 예리하게 분별해내며, 번역 과정 없이도 100개 이상의 언어를 동일한 다국어 벡터 공간으로 일관성 있게 맵핑할 수 있습니다.</li>
      <li>최상위 성능의 모델을 오픈소스로 무료 공개한 것은 검색 시스템 구축 문턱을 허물고 엔터프라이즈 AI 애플리케이션의 확산시키며, 나아가 이와 맞물린 마이크로소프트 자체 클라우드(Azure) 인프라 수요를 촉진하기 위한 전략적 선택(“commoditizing your complement”)으로 평가됩니다.</li>
    </ul>
  </li>
</ul>]]></content><author><name>{&quot;avatar&quot;=&gt;nil, &quot;name&quot;=&gt;nil, &quot;pronouns&quot;=&gt;nil, &quot;bio&quot;=&gt;nil, &quot;location&quot;=&gt;nil, &quot;employer&quot;=&gt;nil, &quot;uri&quot;=&gt;nil, &quot;email&quot;=&gt;&quot;contact@parameterfreak.com&quot;, &quot;academia&quot;=&gt;nil, &quot;arxiv&quot;=&gt;nil, &quot;googlescholar&quot;=&gt;nil, &quot;inspire-hep&quot;=&gt;nil, &quot;impactstory&quot;=&gt;nil, &quot;orcid&quot;=&gt;nil, &quot;semantic&quot;=&gt;nil, &quot;pubmed&quot;=&gt;nil, &quot;researchgate&quot;=&gt;nil, &quot;scopus&quot;=&gt;nil, &quot;bitbucket&quot;=&gt;nil, &quot;codepen&quot;=&gt;nil, &quot;dribbble&quot;=&gt;nil, &quot;github&quot;=&gt;nil, &quot;kaggle&quot;=&gt;nil, &quot;stackoverflow&quot;=&gt;nil, &quot;artstation&quot;=&gt;nil, &quot;bluesky&quot;=&gt;nil, &quot;facebook&quot;=&gt;nil, &quot;flickr&quot;=&gt;nil, &quot;foursquare&quot;=&gt;nil, &quot;goodreads&quot;=&gt;nil, &quot;google_plus&quot;=&gt;nil, &quot;keybase&quot;=&gt;nil, &quot;instagram&quot;=&gt;nil, &quot;lastfm&quot;=&gt;nil, &quot;linkedin&quot;=&gt;nil, &quot;mastodon&quot;=&gt;nil, &quot;medium&quot;=&gt;nil, &quot;pinterest&quot;=&gt;nil, &quot;soundcloud&quot;=&gt;nil, &quot;steam&quot;=&gt;nil, &quot;telegram&quot;=&gt;nil, &quot;tumblr&quot;=&gt;nil, &quot;twitter&quot;=&gt;nil, &quot;vine&quot;=&gt;nil, &quot;weibo&quot;=&gt;nil, &quot;wikipedia&quot;=&gt;nil, &quot;xing&quot;=&gt;nil, &quot;youtube&quot;=&gt;nil, &quot;zhihu&quot;=&gt;nil}</name><email>contact@parameterfreak.com</email></author><category term="Misc" /><category term="AI" /><category term="News" /><category term="Reference" /><summary type="html"><![CDATA[AI Daily Picks(20260423)]]></summary></entry><entry><title type="html">AI Weekly Picks(16주차)</title><link href="https://parameterfreak.com/posts/2026/04/ai-weekly-picks-202616/" rel="alternate" type="text/html" title="AI Weekly Picks(16주차)" /><published>2026-04-13T00:00:00+00:00</published><updated>2026-04-13T00:00:00+00:00</updated><id>https://parameterfreak.com/posts/2026/04/ai-weekly-picks</id><content type="html" xml:base="https://parameterfreak.com/posts/2026/04/ai-weekly-picks-202616/"><![CDATA[<h1 id="ai-daily-picks20260415">AI Daily Picks(20260415)</h1>

<ul>
  <li><a href="https://llm-d.ai/blog/kvcache-wins-you-can-see">KV-Cache Wins You Can See: From Prefix Caching in vLLM to Distributed Scheduling with llm-d</a>
    <ul>
      <li>LLM inference 환경에서 KV-Cache hit rate은 성능(지연 시간)과 비용(최대 10배 차이)에 직결되는 핵심 지표이며 대화형 AI나 에이전트 워크플로우같이 접두사(Prefix)가 긴 패턴에서 그 중요성이 더욱 부각됨.</li>
      <li>단일 인스턴스의 vLLM 캐싱 효과는 분산 환경 로드밸런싱 과정에서 무력화되기 쉬우나, llm-d는 vLLM 포드들의 KVEvents를 통해 실시간 글로벌 캐시 뷰를 구축하여 문제를 해결함.</li>
      <li>구축된 뷰를 바탕으로 한 Precise Prefix-Cache Aware 스케줄링으로 캐시 재사용을 극대화하여, 기존의 근사치 기반/부하 기반 스케줄러 대비 응답 속도(TTFT)를 최대 57배 높이고 시스템 처리량을 2배 이상 향상시킴.</li>
    </ul>
  </li>
  <li><a href="https://developer.nvidia.com/blog/accelerate-large-scale-llm-inference-and-kv-cache-offload-with-cpu-gpu-memory-sharing">Accelerate Large-Scale LLM Inference and KV Cache Offload with CPU-GPU Memory Sharing</a>
    <ul>
      <li>NVIDIA Grace Blackwell 및 Grace Hopper 아키텍처는 NVLink-C2C를 통해 CPU와 GPU 간 통합 메모리 주소 공간을 제공하여 명시적인 데이터 전송 없이 메모리를 공유함.</li>
      <li>Llama 3 70B와 같은 대규모 LLM은 추론 시 GPU 메모리(예: GH200의 96GB) 한계를 넘어 OOM(Out-of-Memory) 에러를 발생시키기 쉬움.</li>
      <li>RAPIDS Memory Manager (RMM) 라이브러리를 활용해 관리 메모리(managed memory)를 할당하면 CPU 메모리(최대 480GB)와 GPU 메모리를 함께 사용하여 물리적 GPU 메모리 한계를 극복하고 대규모 모델 추론이 가능함.</li>
    </ul>
  </li>
</ul>

<h1 id="ai-daily-picks20260414">AI Daily Picks(20260414)</h1>

<ul>
  <li><a href="https://arxiv.org/html/2401.00368v1">Improving Text Embeddings with Large Language Models</a>
    <ul>
      <li>복잡한 파이프라인이나 수작업 레이블 데이터에 의존하지 않고, LLM을 활용해 합성 데이터(Synthetic Data)만으로 고품질 텍스트 임베딩 모델을 학습시키는 방법을 제안했습니다.</li>
      <li>93개 언어 및 수십만 개의 임베딩 태스크를 아우르는 합성 데이터를 통해 기존 임베딩 모델들의 제약(언어 편중 및 태스크 제한 등)을 효과적으로 극복했습니다.</li>
      <li>합성 데이터만을 사용하여 Mistral-7B 모델을 파인튜닝하는 방식으로 기존 모델에 필적하는 경쟁력을 입증했으며, 다른 레이블 데이터와 혼합 시 BEIR 및 MTEB 등 주요 벤치마크에서 SOTA(최고 성능)를 달성했습니다.</li>
    </ul>
  </li>
  <li><a href="https://siliconangle.com/2026/01/15/mongodb-combines-database-embedding-models-simplified-ai-development/">MongoDB combines database and embedding models for simplified AI development - SiliconANGLE</a>
    <ul>
      <li>MongoDB는 AI 개발자들이 애플리케이션을 프로토타입에서 프로덕션으로 빠르게 전환할 수 있도록 자사의 핵심 데이터베이스와 작년에 인수한 Voyage AI의 임베딩 기술을 긴밀하게 통합했다고 발표했습니다.</li>
      <li>Voyage 4 계열 모델(voyage-4, voyage-4-large, voyage-4-lite, 모델 가중치가 공개된 로컬 테스트를 위한 voyage-4-nano)을 API를 통해 MongoDB Atlas와 온프레미스 커뮤니티 에디션에서 텍스트 및 여러 형식 간의 검색(voyage-multimodal-3.5)을 위해 지원합니다.</li>
      <li>퍼블릭 프리뷰 상태로 출시된 ‘자동 임베딩’ 기능은 데이터 삽입이나 쿼리 시 자동으로 임베딩을 생성 및 저장하여, 개발자가 별도의 임베딩 파이프라인이나 벡터 DB를 관리할 필요성을 줄이고 운영 위험과 지연 시간을 낮출 수 있게 해줍니다.</li>
    </ul>
  </li>
  <li><a href="https://dmsretail.com/RetailNews/fine-tuning-embedding-models-for-enterprise-retrieval-a-practical-guide-with-nvidia-nemotron-recipe/">Fine-Tuning Embedding Models for Enterprise Retrieval: A Practical Guide with NVIDIA Nemotron Recipe - Retail News &amp; More</a>
    <ul>
      <li>Cisco는 NVIDIA Nemotron RAG 파인튜닝 레시피를 활용해 수작업 데이터 레이블링 없이 생성된 합성 데이터(SDG)만으로 엔터프라이즈 도메인 특화 임베딩 모델(NV-EmbedQA)을 성공적으로 파인튜닝했습니다.</li>
      <li>단일 GPU 인프라(Cisco AI Pods, NVIDIA H200) 환경에서 모델 학습이 진행되어 데이터 보안을 유지하고 외부 API 비용을 없앴으며, 전체 파이프라인을 단 통상 몇 시간부터 며칠 내 완료해 빠른 가치 검증을 도출해냈습니다.</li>
      <li>베이스 임베딩 모델과 비교해 주요 검색 지표(NDCG@1, Recall@10 등) 전반에서 눈에 띄는 성능 개선을 달성했으며, 특히 특정 도메인 질의에서의 검색 품질이 상당히 향상되었음을 확인했습니다.</li>
    </ul>
  </li>
  <li><a href="https://crewai.com/blog/the-state-of-agentic-ai-in-2026">The state of agentic AI in 2026</a>
    <ul>
      <li>에이전틱 AI(Agentic AI)는 단순한 실험 단계를 넘어 프로덕션 도입의 최우선 순위로 자리잡았으며, 조사 대상 기업의 100%가 2026년에 활용 수준을 확대할 계획이고 74%는 이를 전략적 필수 과제로 인식하고 있습니다.</li>
      <li>기업 리더들은 플랫폼 평가 시 즉각적인 ROI보다는 보안과 거버넌스(34%), 기존 시스템과의 통합(30%), 안정성 및 평가 지표(24%) 등 신뢰성 및 운영 준비도를 최우선으로 고려합니다.</li>
      <li>데이터 부족과 전문 인력 한계 같은 확장성의 장벽이 존재하지만 절반 이상의 조직(57%)이 시스템 종속성이 없는 오픈 소스 기반 도구 확장을 선호하며, 시간 절약 및 운영 비용 절감 등 실질적인 혜택을 전사적으로 경험하고 있습니다.</li>
    </ul>
  </li>
  <li>
    <table>
      <tbody>
        <tr>
          <td>[Linux lays down the law on AI-generated code, says yes to Copilot, no to AI slop, and humans take the fall for mistakes - after months of fierce debate, Torvalds and maintainers come to an agreement</td>
          <td>Tom’s Hardware](https://www.tomshardware.com/software/linux/linux-lays-down-the-law-on-ai-generated-code-yes-to-copilot-no-to-ai-slop-and-humans-take-the-fall-for-mistakes-after-months-of-fierce-debate-torvalds-and-maintainers-come-to-an-agreement)</td>
        </tr>
      </tbody>
    </table>
    <ul>
      <li>리눅스 커널 커뮤니티가 AI 생성 코드에 대한 공식 정책을 수립하여 AI 도구 활용을 공식적으로 허용하되 엄격한 투명성과 책임 규정을 적용하기로 합의했습니다.</li>
      <li>제출자는 의무적으로 “Assisted-by” 태그를 사용하여 AI의 코드 지원 내역을 명시해야 하며, 코드의 최종 품질이나 잠재적인 버그 문제에 대한 모든 책임은 코드를 제출한 인간 개발자에게 있습니다.</li>
      <li>AI 코드를 전면 금지하는 다른 오픈소스 프로젝트와 달리, “AI는 일종의 도구일 뿐”이라는 기조 하에 도구 통제보다는 제출자의 책임 소재 확립에 집중하는 실용적인 정책을 도입했습니다.</li>
    </ul>
  </li>
</ul>

<h1 id="ai-daily-picks20260413">AI Daily Picks(20260413)</h1>

<ul>
  <li><a href="https://nerdleveltech.com/google-turboquant-kv-cache-compression-llm-inference">Google’s TurboQuant: 6x Less Memory for LLM Inference (2026) - Nerd Level Tech</a>
    <ul>
      <li>구글 연구진이 발표한 TurboQuant 알고리즘은 LLM의 주요 메모리 병목인 KV 캐시를 정확도 손실 없이 3비트로 압축하여 메모리 사용량을 최대 6배 감소시킴.</li>
      <li>무작위 직교 회전(Random Orthogonal Rotation)으로 좌표 구성을 균일하게 한 후 Lloyd-Max 최적 양자화를 적용하며, QJL을 통해 에러를 교정하는 과정으로 데이터나 아키텍처 의존성 없이 압축 효율성을 달성.</li>
      <li>평가 벤치마크(LongBench 등)에서 기준점과 동등한 점수를 기록하였으며, H100 환경에서 어텐션 로짓 계산 속도를 8배 향상시켜 저렴한 환경에서 긴 컨텍스트 모델 구동을 가능하게 함.</li>
    </ul>
  </li>
  <li><a href="https://blogs.bing.com/search/April-2026/Microsoft-Open-Sources-Industry-Leading-Embedding-Model">Microsoft Open-Sources Industry-Leading Embedding Model</a>
    <ul>
      <li>마이크로소프트가 검색 품질 향상 및 차세대 AI 에이전트를 위한 강력한 다국어 텍스트 임베딩 모델 ‘Harrier(Harrier-OSS-v1)’ 제품군을 오픈소스로 공개함.</li>
      <li>100개 이상의 언어 지원과 32k 토큰의 긴 컨텍스트 윈도우 처리가 가능하며, Multilingual MTEB v2 벤치마크 평가에서 기존 주요 모델(Gemini Embedding 2 등)을 크게 능가하는 SOTA 성능을 기록함.</li>
      <li>GPT-5를 활용한 합성 데이터 생성과 20억 쌍의 사전 학습을 거쳤으며, 최고 성능의 27B 모델로부터 소형 모델(0.6B, 270M)로 지식 증류(Knowledge Distillation)를 진행해 매개변수 대비 극대화된 효율성을 확보함.</li>
    </ul>
  </li>
</ul>]]></content><author><name>{&quot;avatar&quot;=&gt;nil, &quot;name&quot;=&gt;nil, &quot;pronouns&quot;=&gt;nil, &quot;bio&quot;=&gt;nil, &quot;location&quot;=&gt;nil, &quot;employer&quot;=&gt;nil, &quot;uri&quot;=&gt;nil, &quot;email&quot;=&gt;&quot;contact@parameterfreak.com&quot;, &quot;academia&quot;=&gt;nil, &quot;arxiv&quot;=&gt;nil, &quot;googlescholar&quot;=&gt;nil, &quot;inspire-hep&quot;=&gt;nil, &quot;impactstory&quot;=&gt;nil, &quot;orcid&quot;=&gt;nil, &quot;semantic&quot;=&gt;nil, &quot;pubmed&quot;=&gt;nil, &quot;researchgate&quot;=&gt;nil, &quot;scopus&quot;=&gt;nil, &quot;bitbucket&quot;=&gt;nil, &quot;codepen&quot;=&gt;nil, &quot;dribbble&quot;=&gt;nil, &quot;github&quot;=&gt;nil, &quot;kaggle&quot;=&gt;nil, &quot;stackoverflow&quot;=&gt;nil, &quot;artstation&quot;=&gt;nil, &quot;bluesky&quot;=&gt;nil, &quot;facebook&quot;=&gt;nil, &quot;flickr&quot;=&gt;nil, &quot;foursquare&quot;=&gt;nil, &quot;goodreads&quot;=&gt;nil, &quot;google_plus&quot;=&gt;nil, &quot;keybase&quot;=&gt;nil, &quot;instagram&quot;=&gt;nil, &quot;lastfm&quot;=&gt;nil, &quot;linkedin&quot;=&gt;nil, &quot;mastodon&quot;=&gt;nil, &quot;medium&quot;=&gt;nil, &quot;pinterest&quot;=&gt;nil, &quot;soundcloud&quot;=&gt;nil, &quot;steam&quot;=&gt;nil, &quot;telegram&quot;=&gt;nil, &quot;tumblr&quot;=&gt;nil, &quot;twitter&quot;=&gt;nil, &quot;vine&quot;=&gt;nil, &quot;weibo&quot;=&gt;nil, &quot;wikipedia&quot;=&gt;nil, &quot;xing&quot;=&gt;nil, &quot;youtube&quot;=&gt;nil, &quot;zhihu&quot;=&gt;nil}</name><email>contact@parameterfreak.com</email></author><category term="Misc" /><category term="AI" /><category term="News" /><category term="Reference" /><summary type="html"><![CDATA[AI Daily Picks(20260415)]]></summary></entry><entry><title type="html">AI Weekly Picks(15주차)</title><link href="https://parameterfreak.com/posts/2026/04/ai-weekly-picks-202615/" rel="alternate" type="text/html" title="AI Weekly Picks(15주차)" /><published>2026-04-09T00:00:00+00:00</published><updated>2026-04-09T00:00:00+00:00</updated><id>https://parameterfreak.com/posts/2026/04/ai-weekly-picks</id><content type="html" xml:base="https://parameterfreak.com/posts/2026/04/ai-weekly-picks-202615/"><![CDATA[<h1 id="ai-daily-picks20260410">AI Daily Picks(20260410)</h1>

<ul>
  <li><a href="/Users/jaehoonkim/ws/tmp/til/paper/2602.22442v2.pdf">A Framework for Assessing AI Agent Decisions and Outcomes in AutoML Pipelines</a>
    <ul>
      <li>LLM 기반의 Agentic AutoML 파이프라인에서 중간 의사결정 과정을 평가하기 위한 전용 평가 에이전트(Evaluation Agent, EA) 프레임워크를 제안함.</li>
      <li>기존 평가는 최종 모델 성능(정확도 등)에만 치중하지만, EA는 의사결정 타당성, 추론 일관성, 정확도 이외의 모델 품질, 그리고 반사실적(counterfactual) 요인 분석 등 4가지 차원에서 시스템을 다각적으로 진단함.</li>
      <li>실험 결과, EA는 0.919의 F1 스코어로 잘못된 의사결정을 탐지하고 시스템의 최종 성능에 가려진 추론 오류 및 성능 변동(-4.9% ~ +8.3%)의 근본 원인을 효과적으로 식별함.</li>
    </ul>
  </li>
</ul>

<h1 id="ai-daily-picks20260409">AI Daily Picks(20260409)</h1>

<ul>
  <li><a href="https://www.morphllm.com/llm-inference">LLM Inference: Prefill, Decode, KV Cache &amp; Cost Guide (2026) - Morph</a>
    <ul>
      <li>LLM 추론은 병렬로 입력 토큰을 처리하는 Prefill(연산 집약적) 단계와 토큰을 하나씩 생성하는 Decode(메모리 대역폭 집약적) 단계로 나뉨.</li>
      <li>KV Cache는 이전 토큰 처리 결과를 저장해 비용을 O(n)으로 줄여주지만 많은 메모리를 소모하므로 PagedAttention, 양자화 등의 기법이 필수적으로 적용됨.</li>
      <li>추론 비용과 효율성을 개선하기 위해 Flash Attention 3, 연속 배치(Continuous Batching), 추측 해독(Speculative Decoding) 같은 최적화 기법이 널리 쓰임.</li>
      <li>요약하자면 토큰 전달량을 줄이는 컨텍스트 압축이 추론 속도를 높이고 전체 비용을 낮추는 가장 근본적인 최적화 방법임.</li>
    </ul>
  </li>
</ul>]]></content><author><name>{&quot;avatar&quot;=&gt;nil, &quot;name&quot;=&gt;nil, &quot;pronouns&quot;=&gt;nil, &quot;bio&quot;=&gt;nil, &quot;location&quot;=&gt;nil, &quot;employer&quot;=&gt;nil, &quot;uri&quot;=&gt;nil, &quot;email&quot;=&gt;&quot;contact@parameterfreak.com&quot;, &quot;academia&quot;=&gt;nil, &quot;arxiv&quot;=&gt;nil, &quot;googlescholar&quot;=&gt;nil, &quot;inspire-hep&quot;=&gt;nil, &quot;impactstory&quot;=&gt;nil, &quot;orcid&quot;=&gt;nil, &quot;semantic&quot;=&gt;nil, &quot;pubmed&quot;=&gt;nil, &quot;researchgate&quot;=&gt;nil, &quot;scopus&quot;=&gt;nil, &quot;bitbucket&quot;=&gt;nil, &quot;codepen&quot;=&gt;nil, &quot;dribbble&quot;=&gt;nil, &quot;github&quot;=&gt;nil, &quot;kaggle&quot;=&gt;nil, &quot;stackoverflow&quot;=&gt;nil, &quot;artstation&quot;=&gt;nil, &quot;bluesky&quot;=&gt;nil, &quot;facebook&quot;=&gt;nil, &quot;flickr&quot;=&gt;nil, &quot;foursquare&quot;=&gt;nil, &quot;goodreads&quot;=&gt;nil, &quot;google_plus&quot;=&gt;nil, &quot;keybase&quot;=&gt;nil, &quot;instagram&quot;=&gt;nil, &quot;lastfm&quot;=&gt;nil, &quot;linkedin&quot;=&gt;nil, &quot;mastodon&quot;=&gt;nil, &quot;medium&quot;=&gt;nil, &quot;pinterest&quot;=&gt;nil, &quot;soundcloud&quot;=&gt;nil, &quot;steam&quot;=&gt;nil, &quot;telegram&quot;=&gt;nil, &quot;tumblr&quot;=&gt;nil, &quot;twitter&quot;=&gt;nil, &quot;vine&quot;=&gt;nil, &quot;weibo&quot;=&gt;nil, &quot;wikipedia&quot;=&gt;nil, &quot;xing&quot;=&gt;nil, &quot;youtube&quot;=&gt;nil, &quot;zhihu&quot;=&gt;nil}</name><email>contact@parameterfreak.com</email></author><category term="Misc" /><category term="AI" /><category term="News" /><category term="Reference" /><summary type="html"><![CDATA[AI Daily Picks(20260410)]]></summary></entry><entry><title type="html">H-MAS v0.4.0 release</title><link href="https://parameterfreak.com/posts/2026/04/h-mas-v0.4.0-release/" rel="alternate" type="text/html" title="H-MAS v0.4.0 release" /><published>2026-04-05T00:00:00+00:00</published><updated>2026-04-05T00:00:00+00:00</updated><id>https://parameterfreak.com/posts/2026/04/h-mas-v0.4.0-release</id><content type="html" xml:base="https://parameterfreak.com/posts/2026/04/h-mas-v0.4.0-release/"><![CDATA[<h2 id="h-mas-v040-developer-preview">H-MAS v0.4.0 Developer Preview</h2>

<blockquote>
  <p><strong>“실제 클러스터에서 모델이 돌아간다”</strong></p>
</blockquote>

<p>xxxxxxx 기반 멀티 클러스터 관리, AI 모델 배포/서빙, 웹 콘솔을 갖춘 <strong>첫 공개 버전</strong>입니다.</p>

<h3 id="highlights">Highlights</h3>

<ul>
  <li><strong>멀티 클러스터 배포</strong> — xxxxxxx Push 모드로 여러 클러스터에 모델을 분산 배포</li>
  <li><strong>AI 모델 서빙 E2E</strong> — 웹 콘솔에서 모델 선택 → 배포 → inference 호출까지 한 번에</li>
  <li><strong>서빙 런타임</strong> — Ollama, vLLM, llama.cpp 등 5종 지원, GPU/CPU 자동 선택</li>
  <li><strong>웹 콘솔</strong> — 대시보드, 클러스터, 정책, 배포, 인스턴스, 로그, 모델, 설정 (9개 페이지)</li>
  <li><strong>JWT 인증</strong> — HttpOnly Cookie 기반 로그인, Access Token 자동 갱신</li>
  <li><strong>원커맨드 설치</strong> — <code class="language-plaintext highlighter-rouge">./scripts/install.sh --registry-token &lt;PAT&gt;</code>로 H-MAS 전체 설치</li>
</ul>

<h3 id="quick-start">Quick Start</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># 자동 설치 (xxxxxxx + H-MAS)</span>
./scripts/install.sh <span class="nt">--registry-token</span> &lt;GHCR-PAT&gt;

<span class="c"># 접속</span>
<span class="c"># 웹 콘솔: http://localhost:30000</span>
<span class="c"># API:     http://localhost:30080</span>
</code></pre></div></div>

<blockquote>
  <p>상세 설치 가이드: INSTALLATION_GUIDE.md</p>
</blockquote>

<h3 id="docker-images">Docker Images</h3>

<table>
  <thead>
    <tr>
      <th>Image</th>
      <th>Tag</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">ghcr.io/xxxxxxxxxx/hmas-backend</code></td>
      <td><code class="language-plaintext highlighter-rouge">v0.4.0</code>, <code class="language-plaintext highlighter-rouge">latest</code></td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">ghcr.io/xxxxxxxxxx/hmas-frontend</code></td>
      <td><code class="language-plaintext highlighter-rouge">v0.4.0</code>, <code class="language-plaintext highlighter-rouge">latest</code></td>
    </tr>
  </tbody>
</table>

<h3 id="full-changelog">Full Changelog</h3>

<p>전체 변경사항은 CHANGELOG.md를 참조하세요.</p>

<h3 id="개발-히스토리">개발 히스토리</h3>

<p>v0.4.0까지의 주간 개발 기록입니다.</p>

<table>
  <thead>
    <tr>
      <th>기간</th>
      <th>주요 내용</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><a href="/posts/2026/04/h-mas-weekly-release-notes-0329-0404/">2026-03-29 ~ 04-04</a></td>
      <td>v0.4.0 릴리즈 — JWT 인증, 설치 자동화, 로그 실데이터 연동</td>
    </tr>
    <tr>
      <td><a href="/posts/2026/03/h-mas-weekly-release-notes-0322-0328/">2026-03-22 ~ 03-28</a></td>
      <td>멀티 클러스터 E2E 검증, Standard 서빙 검증</td>
    </tr>
    <tr>
      <td><a href="/posts/2026/03/h-mas-weekly-release-notes-0315-0321/">2026-03-15 ~ 03-21</a></td>
      <td>배포 폼 리디자인, 장애 복구 구현</td>
    </tr>
    <tr>
      <td><a href="/posts/2026/03/h-mas-weekly-release-notes-0308-0314/">2026-03-08 ~ 03-14</a></td>
      <td>인스턴스 관리, 모델 저장소</td>
    </tr>
    <tr>
      <td><a href="/posts/2026/03/h-mas-weekly-release-notes-0301-0307/">2026-03-01 ~ 03-07</a></td>
      <td>배포 정책 엔진, 클러스터 분류</td>
    </tr>
    <tr>
      <td><a href="/posts/2026/02/h-mas-weekly-release-notes-0222-0228/">2026-02-22 ~ 02-28</a></td>
      <td>대시보드, 클러스터 등록</td>
    </tr>
    <tr>
      <td><a href="/posts/2026/02/h-mas-weekly-release-notes-0215-0221/">2026-02-15 ~ 02-21</a></td>
      <td>웹 콘솔 기초, API 설계</td>
    </tr>
    <tr>
      <td><a href="/posts/2026/02/h-mas-weekly-release-notes-0208-0214/">2026-02-08 ~ 02-14</a></td>
      <td>프로젝트 구조, 멀티 클러스터 PoC</td>
    </tr>
    <tr>
      <td><a href="/posts/2026/02/h-mas-weekly-release-notes-0201-0207/">2026-02-01 ~ 02-07</a></td>
      <td>초기 Backend/Frontend 구축</td>
    </tr>
  </tbody>
</table>]]></content><author><name>{&quot;avatar&quot;=&gt;nil, &quot;name&quot;=&gt;nil, &quot;pronouns&quot;=&gt;nil, &quot;bio&quot;=&gt;nil, &quot;location&quot;=&gt;nil, &quot;employer&quot;=&gt;nil, &quot;uri&quot;=&gt;nil, &quot;email&quot;=&gt;&quot;contact@parameterfreak.com&quot;, &quot;academia&quot;=&gt;nil, &quot;arxiv&quot;=&gt;nil, &quot;googlescholar&quot;=&gt;nil, &quot;inspire-hep&quot;=&gt;nil, &quot;impactstory&quot;=&gt;nil, &quot;orcid&quot;=&gt;nil, &quot;semantic&quot;=&gt;nil, &quot;pubmed&quot;=&gt;nil, &quot;researchgate&quot;=&gt;nil, &quot;scopus&quot;=&gt;nil, &quot;bitbucket&quot;=&gt;nil, &quot;codepen&quot;=&gt;nil, &quot;dribbble&quot;=&gt;nil, &quot;github&quot;=&gt;nil, &quot;kaggle&quot;=&gt;nil, &quot;stackoverflow&quot;=&gt;nil, &quot;artstation&quot;=&gt;nil, &quot;bluesky&quot;=&gt;nil, &quot;facebook&quot;=&gt;nil, &quot;flickr&quot;=&gt;nil, &quot;foursquare&quot;=&gt;nil, &quot;goodreads&quot;=&gt;nil, &quot;google_plus&quot;=&gt;nil, &quot;keybase&quot;=&gt;nil, &quot;instagram&quot;=&gt;nil, &quot;lastfm&quot;=&gt;nil, &quot;linkedin&quot;=&gt;nil, &quot;mastodon&quot;=&gt;nil, &quot;medium&quot;=&gt;nil, &quot;pinterest&quot;=&gt;nil, &quot;soundcloud&quot;=&gt;nil, &quot;steam&quot;=&gt;nil, &quot;telegram&quot;=&gt;nil, &quot;tumblr&quot;=&gt;nil, &quot;twitter&quot;=&gt;nil, &quot;vine&quot;=&gt;nil, &quot;weibo&quot;=&gt;nil, &quot;wikipedia&quot;=&gt;nil, &quot;xing&quot;=&gt;nil, &quot;youtube&quot;=&gt;nil, &quot;zhihu&quot;=&gt;nil}</name><email>contact@parameterfreak.com</email></author><category term="H-MAS" /><category term="MLOps" /><category term="GPU" /><category term="Scheduling" /><category term="K8s" /><category term="Inference" /><summary type="html"><![CDATA[H-MAS v0.4.0 Developer Preview]]></summary></entry></feed>