从以下三个方向中任选一个完成大作业。每个方向都聚焦 AI 基础设施 (而非 AI 应用),覆盖课程的多个核心模块。
实验环境: 课程结束后一周内提供包含 GPU 服务器和 K8s 集群的实验环境,用于方向 A (Docker + CUDA hook) 和方向 B (K8s 调度 + vLLM 推理)。方向 C 零硬件依赖,纯 Python 标准库即可完成。
骨架代码: 每个方向在
code/目录下提供了可运行的骨架框架,关键位置标注# TODO:。搜索TODO即可找到需要完成的代码位置。详见code/README.md。
课程结束后两周
code/REPORT_TEMPLATE.md 模板学号_姓名_大作业.zip| 维度 | 权重 | 要求 |
|---|---|---|
| 技术深度 | 35% | 正确应用课程知识,设计有依据,代码实现完整 |
| 实验与分析 | 25% | 有实验数据 (性能/对比/分析),结论有理有据 |
| 工程完整性 | 20% | 代码可运行、有 README、有错误处理、结构清晰 |
| 报告质量 | 20% | 架构图清晰、逻辑连贯、有自己的思考 |
| 难度: ★★★☆ (中等) | 覆盖模块: 1, 3, 5 | 估计代码量: ~300 行 (Dockerfile ~20 + C ~100 + Python ~150) |
难度说明: Dockerfile 部分较简单 (模块 1 已实践);LD_PRELOAD CUDA hook 是核心挑战,但
cudaMalloc的拦截模式与模块 3 的 malloc 完全相同 (编译命令也相同:gcc -shared -fPIC -ldl),主要工作是理解 CUDA Runtime API 的返回值和配额逻辑;nano-vllm 集成有模块 5 的 tracing 脚本可直接参考。
从零构建一个 GPU 推理容器,深入理解容器隔离机制和 GPU 虚拟化原理。通过 LD_PRELOAD 拦截 CUDA 调用,验证 GPU 资源隔离的有效性。
docker run --gpus all 背后 NVIDIA Container Toolkit 的设备注入过程:
/dev/nvidia* 设备文件从何而来?libcuda.so 等驱动库如何挂载进容器?nvidia-smi 在容器内为何能看到 GPU?strace 追踪 docker run --gpus all 的完整系统调用序列libcuda_hook.so,使用 LD_PRELOAD 拦截 CUDA Runtime API:
cudaMalloc — 记录每次显存分配 (大小、指针地址),实现显存配额管理 (通过环境变量 CUDA_MEM_QUOTA_MB 设置配额,超配额时返回 cudaErrorMemoryAllocation)cudaFree — 记录释放,跟踪当前已分配总量dlsym(RTLD_NEXT, ...) 获取原始函数指针并转发调用gcc -shared -fPIC -o libcuda_hook.so cuda_hook.c -ldl (无需链接 CUDA 库,符号由目标进程提供)code/01_mymalloc.c 的 __thread 递归守卫模式;printf 内部可能调用 malloc → Hook 内避免使用可能触发自身拦截的函数LD_PRELOAD=./libcuda_hook.so python example.py,观察日志输出和配额生效example.pycudaMalloc 增加了多少延迟?)cuda_hook.c + Makefile: LD_PRELOAD hook 源码 + 编译脚本 (基于骨架 gpu-container-hook/)Dockerfile: GPU 推理容器镜像experiments/: 实验数据目录,含 strace 日志、CUDA API 调用统计 (CSV 或文本)、显存分配时间线图表 (PNG)REPORT.md: 技术报告| 难度: ★★★☆ (中等) | 覆盖模块: 1, 4, 7 | 估计代码量: ~350 行 | 可 2 人协作 (YAML ~120 + 网关 ~180 + 压测脚本 ~50) |
难度说明: K8s YAML 部分较简单 (模块 4 已实践);网关可直接复用模块 7
code/ai_gateway.py并增强;GPU 调度追踪本质是kubectl describe/events+ 画时序图。使用 Qwen2.5-0.5B (~1GB) 等小模型部署 vLLM 实例,同时满足 GPU 调度追踪和网关真实后端的需求,将两条主线串起来。
围绕 K8s GPU 调度全链路和推理网关部署两条主线:深入追踪 GPU Pod 从 YAML 到运行的完整过程,同时将 AI 网关部署到 K8s 并验证弹性伸缩与故障恢复。
协作说明: 本方向最多可由两人协作完成 — 一人负责网关实现 (Flask + LB 策略 + 健康检查),一人负责 K8s 部署 (YAML + HPA + GPU 调度追踪)。合并后联调压测。提交时需注明分工。
nvidia.com/gpu: 1)kubectl apply → API Server 接收 → 写入 etcdAllocate() → 返回 GPU UUIDmknod /dev/nvidia* → mount --bind 驱动库nvidia-smi 可见kubectl describe pod 和 kubectl get events 记录每一步的时序和状态变化visuals/k8s-gpu-flow.html)kubectl --dry-run=client 或 kubeconform 验证无语法错误requiredDuringSchedulingapp.py: 网关源码 (基于骨架 k8s-gateway/app.py)k8s/: 部署 YAML 目录,含后端/网关/ConfigMap/HPA 共 4 个文件 + kubectl --dry-run 验证输出benchmark/: 压测脚本 (推荐 locust 或 wrk) + 实验结果 (CSV + 图表) + GPU 调度时序图 (PNG)REPORT.md: 技术报告| 难度: ★★★★ (较难) | 覆盖模块: 2, 5, 6 | 估计代码量: ~500 行 Python (计算工具 ~150 + 碎片模拟器 ~200 + Cache 模拟器 ~100 + 可视化 ~50) |
难度说明: 三个独立模块,每个都有清晰边界。显存计算工具是模块 6
calculate_qwen3_memory.py的独立重实现,有现成参考;PagedAttention 碎片模拟器是最具挑战的部分 — 需要设计 Block 分配/回收算法和处理请求随机到达的离散事件模拟,但纯 Python 无外部依赖;Prefix Cache LRU 模拟器较简单。每个模块可独立完成和测试。最大优势: 零硬件依赖,纯 Python 标准库 + matplotlib,任何笔记本都能完成。
深入理解 KV Cache 显存管理的核心问题: 碎片从何而来?PagedAttention 如何解决?量化能省多少?通过理论计算 + 模拟实验 + (有 GPU 时) 实际测量,形成完整的量化理解。
--preset (模型预设) 或 --L --H_kv --head-dim --params (手动指定);--dtype --seq-len --batch 控制计算场景code/calculate_qwen3_memory.py,需独立实现)max_tokens 的连续空间如果有 GPU (4090), 增加以下实验:
nvidia-smi 和 torch.cuda.memory_summary() 测量实际显存,与计算工具对比--enable-prefix-caching) 的实际加速效果--kv-cache-dtype fp8) 的并发容量calculator.py: 显存计算工具 (基于骨架 kvcache-simulator/calculator.py)simulator.py: PagedAttention 碎片模拟器 (基于骨架 kvcache-simulator/simulator.py)lru_cache.py: Prefix Cache LRU 模拟器 (基于骨架 kvcache-simulator/lru_cache.py)visualize.py: matplotlib 图表生成 (基于骨架 kvcache-simulator/visualize.py),输出 4 张图表 (模型对比 / 精度并发 / 碎片率 / 命中率)gpu_experiments/ (可选): GPU 实测脚本 + 数据REPORT.md: 技术报告 (含全部图表和分析)01-linux-containers/code/ (Namespace/Cgroup/OverlayFS 演示脚本)03-gpu-virtualization/code/01_mymalloc.c (LD_PRELOAD malloc hook)04-kubernetes-gpu/visuals/k8s-gpu-flow.html (GPU 调度全链路)05-vllm-inference/code/trace_nanovllm.py (nano-vllm 追踪脚本)06-kvcache-optimization/code/calculate_qwen3_memory.py (显存计算脚本)