从以下三个方向中任选一个完成大作业。每个方向都聚焦 AI 基础设施 (而非 AI 应用),覆盖课程的多个核心模块。
实验环境: 课程结束后一周内提供包含 GPU 服务器和 K8s 集群的实验环境,用于方向 A (LD_PRELOAD CUDA hook) 和方向 B (K8s 调度 + vLLM 推理)。方向 C 零硬件依赖,纯 Python 标准库即可完成。
骨架代码: 每个方向在
code/目录下提供了可运行的骨架框架,关键位置标注# TODO:。搜索TODO即可找到需要完成的代码位置。详见code/README.md。
2026年7月31日
code/REPORT_TEMPLATE.md 模板学号_姓名_大作业.zip| 维度 | 权重 | 要求 |
|---|---|---|
| 技术深度 | 35% | 正确应用课程知识,设计有依据,代码实现完整 |
| 实验与分析 | 25% | 有实验数据 (性能/对比/分析),结论有理有据 |
| 工程完整性 | 20% | 代码可运行、有 README、有错误处理、结构清晰 |
| 报告质量 | 20% | 架构图清晰、逻辑连贯、有自己的思考 |
| 难度: ★★★☆ (中等) | 覆盖模块: 3 | 估计代码量: ~250 行 (C ~200 + Python ~50) |
难度说明: 核心挑战是 LD_PRELOAD 拦截两个 CUDA API。但
cudaMalloc的拦截模式与模块 301_mymalloc.c完全相同 (dlsym+__thread+ 配额),cudaLaunchKernel的令牌桶逻辑与模块 303_token_bucket.py完全对应——两样课上都已经手写过,大作业只是把它们搬到 CUDA Runtime API 上。骨架代码已提供完整的函数框架(递归守卫 + 变量声明),学生只需填充配额检查和转发逻辑。
使用 LD_PRELOAD 拦截 CUDA Runtime API,实现对单个进程的显存配额和算力限速——这正是 HAMi libvgpu.so 的核心原理。提供一个统一的 CUDA 测试程序 (test_hook.cu) 验证拦截效果,无需运行推理框架。
cudaMalloc (模块 3 — malloc hook 模式)libcuda_hook.so,使用 LD_PRELOAD 拦截 cudaMalloc:
CUDA_MEM_QUOTA_MB 设置显存配额cudaErrorMemoryAllocation (值为 2),不调用真正的 cudaMallocdlsym(RTLD_NEXT, ...) 获取原始函数指针并转发调用__thread 递归守卫: fprintf(stderr, ...) 内部可能触发 cudaMalloc,必须防止死循环(与模块 3 01_mymalloc.c 完全相同的模式)gcc -shared -fPIC -o libcuda_hook.so cuda_hook.c -ldl(无需链接 CUDA 库,符号由目标进程提供)cudaLaunchKernel (模块 3 — 令牌桶模式)libcuda_hook.so 中拦截 cudaLaunchKernel:
CUDA_CORE_RATE (每秒可启动的 kernel 数) 和 CUDA_CORE_CAPACITY (最大突发数) 配置令牌桶cudaErrorLaunchFailure (值为 4) 或阻塞等待gridDim.x/y/z)、Block 维度 (blockDim.x/y/z)03_token_bucket.py 的 TokenBucket.acquire(): _refill() → 检查 tokens → 扣减或拒绝_refill() 用 clock_gettime(CLOCK_MONOTONIC, ...) 获取高精度时间(骨架代码已提供 launch_refill() 函数)cudaLaunchKernel 的所有参数(func, gridDim, blockDim, args, sharedMem, stream)需原样转发给 real_cudaLaunchKernel使用骨架提供的 test_hook.cu(无需修改)验证拦截效果:
# 编译 hook 和测试程序
make && make test-gpu
# 或手动 (注意 --cudart=shared 是必需的):
nvcc --cudart=shared test_hook.cu -o test_hook
LD_PRELOAD=./libcuda_hook.so \
CUDA_MEM_QUOTA_MB=128 \
CUDA_CORE_RATE=5 \
CUDA_CORE_CAPACITY=3 \
./test_hook
cudaMalloc 配额 — 正常分配成功 + 超配额返回 cudaErrorMemoryAllocation (2)cudaLaunchKernel 限速 — 连续启动 10 个 kernel,前几个通过 (burst),后续被拒绝;等待 1.5s refill 后恢复test_hook 运行产生的 hook 日志,绘制:
cudaMalloc 分配时间线(x=调用序号,y=分配大小)cudaLaunchKernel 通过/拒绝时间线(对比 burst 耗尽 → refill 恢复的令牌数变化)cudaMalloc / cudaLaunchKernelfprintf + clock_gettime 的额外延迟(可通过对比有无 hook 时的 wall-clock 时间估算)cuda_hook.c + Makefile: LD_PRELOAD hook 源码 + 编译脚本(基于骨架 gpu-hook/)experiments/: 实验数据目录,含 hook 日志 (文本)、CUDA API 调用统计 (CSV)、显存 + kernel 时间线图表 (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) + 03_token_bucket.py (令牌桶限流)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 (显存计算脚本)