Una implementación de codificación en kvcached para memoria caché Elastic KV, servicio Bursty LLM y uso compartido de GPU multimodelo
importar numpy como np importar matplotlib.pyplot como plt fig, axes = plt.subplots(1, 2, figsize=(14, 4.5)) tk, mk = zip(*mem_kvc); tb, mb = zip(*mem_base) ejes[0].plot(tk, mk, label=”con kvcached”, linewidth=2, color=”#1f77b4″) ejes[0].plot(tb, mb, label=”baseline (static)”, linewidth=2, linestyle=”–“, color=”#d62728″) ejes[0].axhline(idle_kvc, color=”#1f77b4″, alpha=.3, linestyle=”:”) ejes[0].axhline(idle_base, color=”#d62728″, alpha=.3, linestyle=”:”) ejes[0].set_xlabel(“tiempo(s)”); ejes[0].set_ylabel(“Memoria GPU utilizada (MB)”) ejes[0].set_title(“VRAM bajo una carga de trabajo en ráfagas\n(punteado = VRAM de referencia inactiva)”) ejes[0].grid(alfa=.3); ejes[0].legend() ejes[1].diagrama de caja([lat_kvc, lat_base]etiquetas =[“kvcached”, “baseline”]) ejes[1].set_ylabel(“solicitar latencia(s)”) ejes[1].set_title(f”Latencia en {len(lat_kvc)} solicitudes”) ejes[1].grid(alpha=.3) plt.tight_layout() plt.savefig(“/content/kvcached_single_model.png”, dpi=120, bbox_inches=”tight”) plt.show() print(“\n— Resumen de modelo único ——————————————–“) print(f” VRAM inactiva kvcached: {idle_kvc:>6.0f} MB ” f”baseline: {idle_base:>6.0f} MB ” f”(ahorros: {idle_base – idle_kvc:>5.0f} MB)”) print(f” VRAM pico kvcached: {max(mk):>6.0f} MB ” f”baseline: {max(mb):>6.0f} MB”) print(f” Lat. mediana kvcached: {np.median(lat_kvc):>6.2f} s ” f”baseline: {np.median(lat_base):>6.2f} s”) print(f” VRAM flex kvcached: pico-idle = {max(mk)-min(mk):>5.0f} MB ” f”(la línea base no se puede liberar – grupo estático)”) print(“\n=== Experimento 3: dos LLM compartidos una GPU (kvcached en ambos) ===”) pA, lA = launch_vllm(MODEL_A, PORT_A, kvcached=True, log_path=”/tmp/mA.log”) intente: wait_ready(PORT_A) pB, lB = launch_vllm(MODEL_B, PORT_B, kvcached=True, log_path=”/tmp/mB.log”) intente: wait_ready(PORT_B) print(f” Ambos modelos cargados. VRAM inactiva: {vram_used_mb():.0f} MB”) sampler = MemorySampler(); sampler.start() para i en rango(4): puerto, modelo = ((PORT_A, MODEL_A) if i % 2 == 0 else (PORT_B, MODEL_B)) print(f” round {i+1}: conduciendo {modelo}”) bursty_workload(puerto, modelo, n_bursts=1, burst_size=4, pausa=0) time.sleep(5) sampler.stop() t, m = zip(*sampler.samples) plt.figure(figsize=(11, 4.2)) plt.plot(t, m, color=”#c2410c”, linewidth=2) plt.xlabel(“tiempo (s)”); plt.ylabel(“Memoria de GPU utilizada (MB)”) plt.title(“Dos LLM en un T4 a través de kvcached — la memoria se flexiona por modelo activo”) plt.grid(alpha=.3); plt.tight_layout() plt.savefig(“/content/kvcached_multillm.png”, dpi=120, bbox_inches=”tight”) plt.show() finalmente: apagado(pB, lB) finalmente: apagado(pA, lA) print(“\n=== Bonificación: kvcached incluye herramientas CLI ===”) print(” kvtop – monitor de memoria KV en vivo por instancia (como nvtop for kvcached)”) print(” kvctl — establecer/limitar presupuestos de memoria por instancia en la memoria compartida”) for tool in (“kvtop”, “kvctl”): ruta = Shutil. Which(herramienta) print(f” {herramienta}: {ruta o ‘no en RUTA’}”) print(“\nTodos los gráficos guardados en /content/. Listo.”)