1.
目标与环境准备
- 目标:在香港机房托管GPU服务器,确保推理请求延迟最小化并在SLO内提高吞吐量。
- 环境准备:确认显卡型号(比如A100/RTX30/40系)、驱动CUDA版本、NIC型号(Intel/ Mellanox)、机架与上行链路带宽、是否支持RDMA/NVLink。记录基线硬件信息与当前驱动版本。
2.
基线测量(先量化现状)
- 网络基线:在服务器间用iperf3测带宽与RTT:iperf3 -s/iperf3 -c
-P 10 -t 60。
- GPU/推理基线:用nvidia-smi监控显存与功耗;用trtexec或onnxruntime benchmark工具测单请求延迟和QPS:trtexec --onnx=model.onnx --batch=1 --iterations=100 --time=1000。
- 系统基线:记录netstat、sar、dmesg日志,保存为后续对比。
3.
网络层面优化步骤
- 开启Jumbo Frame:在交换机与服务器上将MTU设置为9000(若链路支持):ip link set dev eth0 mtu 9000。
- 调整NIC中断/RSS:使用ethtool查看并启用多队列rss,提高并发包处理:ethtool -L eth0 combined ;ethtool -K eth0 gro on gso on tso on(或视情况关闭TSO/GSO以减小延迟)。
- 关闭不必要的防火墙/包过滤,使用host network或SR-IOV直通减少虚拟化开销。
4.
内核与TCP参数微调
- 临时修改测试并持久化:sysctl -w net.core.rmem_max=268435456 net.core.wmem_max=268435456。
- 增大net.core.netdev_max_backlog与调整tcp_rmem/tcp_wmem,若拥塞频繁可启用 fq_codel:sysctl -w net.core.netdev_max_backlog=250000。
- 调整TCP keepalive与gRPC/HTTP超时时间以配合SLO,确保短连接场景能复用连接(启用HTTP/2或gRPC长连接)。
5.
GPU与CUDA层面优化
- 开启显卡常驻模式:nvidia-smi -pm 1,避免频繁P-state切换。
- 使用CUDA MPS提高多客户端分时吞吐:启动MPS服务并设置CUDA_VISIBLE_DEVICES;注意MPS适合小延迟请求的并发。
- 利用NVLink/PCIe拓扑放置模型与数据,避免跨NUMA访问,设置进程CPU亲和性(taskset)与CUDA设备亲和。
6.
推理框架与模型优化
- 将模型转换为TensorRT/ONNX并启用FP16/INT8:trtexec --onnx=model.onnx --saveEngine=model.trt --fp16 --workspace=4096。
- 使用动态批次(dynamic batching)但限定最大延迟:Triton的dynamic_batching配置中设置preferred_max_batch_size与max_queue_delay_microseconds。
- 模型剪枝与蒸馏:减少参数和计算量,优先做量化感知训练或离线校准。
7.
并发策略与吞吐调优
- 选择合理批次大小:通过trtexec或负载测试逐步增大batch直到延迟超过SLO,设定为平衡点。
- 并行推理:使用模型分片(multiple model instances)或多线程异步请求队列,确保GPU占用足够但不饱和。
- 预热与预加载:服务器启动后先发送预热请求填满缓存与JIT编译缓存,使用固定流量脚本保持GPU热身。
8.
容器化与部署实践
- Docker运行示例:docker run --gpus '"device=0"' --network host --ulimit memlock=-1 --shm-size=1g -v /models:/models nvcr.io/nvidia/tritonserver:xx tritonserver --model-repository=/models --strict-model-config=false。
- 使用host网络减少网络栈延迟;为容器绑定CPU核(cpuset-cpus)并设置OOM/ulimit预防资源争抢。
9.
监控、告警与自动化
- 部署Prometheus + Grafana采集nvidia-smi、Triton metrics、node_exporter与cAdvisor指标。
- 设置SLO告警(延迟95/99分位、GPU util、queue length),并建立自动扩缩容策略(K8s HPA结合自定义指标或基于队列长度的弹性伸缩)。
10.
一步步实操样例(命令汇总)
- 测带宽/延迟:iperf3 -c peer -P 10 -t 60;ping -c 100 peer。
- NIC优化示例:ethtool -K eth0 tso off gso off gro on;ip link set eth0 mtu 9000。
- 内核参数临时设置:sysctl -w net.core.rmem_max=268435456 net.core.wmem_max=268435456 net.core.netdev_max_backlog=250000。
- GPU & trtexec示例:nvidia-smi -pm 1;trtexec --onnx=model.onnx --saveEngine=model.trt --fp16 --workspace=4096 --shapes=input:1x3x224x224。
- 启动Triton示例:docker run --gpus all --network host -v /models:/models nvcr.io/nvidia/tritonserver:xx tritonserver --model-repository=/models --log-verbose=1。
11.
问:在香港机房跨境访问导致延迟抖动,如何缓解?
- 答:优先做就近部署与多Region冗余;对跨境必须访问的接口做缓存与批处理,使用CDN或边缘缓存,减少跨境频次;在网络层面用BGP多出口或SD-WAN优化路径,必要时申请专线或加装SDP。
12.
问:如何在保证延迟的同时最大化吞吐?
- 答:设定严格的延迟SLO后用动态批次控速(max_queue_delay),在GPU上运行多个模型实例以实现并行短小批次;用FP16/INT8降低单推理耗时并用负载测试找到最优batch与实例数。
13.
问:有哪些关键监控指标必须持续观察?
- 答:重点监控延迟P50/P95/P99、GPU utilization、GPU memory使用、queue length(请求队列深度)、NIC丢包与重传、CPU load与上下游RTT,结合这些指标触发自动化扩容或告警。
来源:香港显卡服务器托管在推理服务中的延迟与吞吐优化技巧