Tritonserver架构
模型调度类型Stateless模型 常见的如CV领域的模型 调度模式:默认的均衡调度,dynamic batch调度 Stateful模型 常见如NLP,语音模型 调度模式: Sequence batch Direct:不打batch,顺序不乱 Oldest:可以做batch,顺序可能打乱 sequence batcher内部通过correlation ID来将语音的序列请求发送到合适的模型实例中 Ensemble模型 模型pipeline 每个模型有自己的调度器 model analyzer 模型分析工具,可提供多模型的部署优化报告 通过throughput, latency, GPU内存等指标来决定如何优化模型配置 提供了两种benchmark分析工具: Performance Analysis: 测量吞吐,延迟指标 Memory Analysis:内存分析 backendcustom backendexample 官方demo:https://github.com/NVIDIA/DeepLearningExamples model repositry...
karmada
CPP bug记录 正常日志: I0515 06:37:48.068444 1 detector.go:234] Reconciling object: v1, kind=ConfigMap, ai-ppt-beautify-test/atms-app-conf-outline-triton-testI0515 06:37:48.068632 1 detector.go:494] Applying cluster policy(atms-app-cm-cpp) for object: v1, kind=ConfigMap, ai-ppt-beautify-test/atms-app-conf-outline-triton-testI0515 06:37:48.068655 1 default.go:88] Default interpreter is not enabled for kind "/v1, Kind=ConfigMap" with operation "InterpretReplica".I...
docker容器网络
容器网络 在CNI中也初步了解过docker容器网络的原理
Go select
源码解析 https://draveness.me/golang/docs/part2-foundation/ch05-keyword/golang-select/ C语言提供的select是监听多个文件描述符,Go的select是类似的作用,可以让Goroutine同时监听多个channel的读写操作,在channel状态改变前,会一直阻塞当前的Goroutine; 核心流程编译期优化编译器会根据select不同的case数量进行优化: 如果空的select,则会转换为runtime.block直接挂起当前Goroutine; 如果只有一个case,则会转换为一个if+channel操作语句; 如果有两个case, 且其中一个是default,则会将其中的case转换为非阻塞的底层发送runtime.selectnbsend/接收runtime.selectnbrecv函数实现; 其它情况下,会通过runtime.selectgo来获取可执行的case索引,通过多个if语句来执行对应case中的代码:chosen, revcOK := selectgo(sel...
Go sync.Map
作用 并发安全的map操作数据结构,适用于“读多写少”和不同协程写不同的key子集的场景; 原理 读写分离 sync.Map结构中,定义了一个只读的read atmoic.Pointer,和一个用于记录写/删操作的dirty atmoic.Pointer,如下图所示: type Map struct { mu Mutex // 并发只读对象,是一个原子指针,需要用到原子锁 read atomic.Pointer[readOnly] // 脏数据,用于写/删操作 dirty map[any]*entry // 统计read中读不到的资源,达到一定阈值,会将dirty promote为read misses int} 其读操作是优先从read中取值,如果read中没值,才会从dirty中取值; // Load returns the value stored in the map for a key, or nil if no// value is present.// The ok result indicates whether value ...
k8s scheduler
资料 https://github.com/rfyiamcool/notes/blob/main/kubernetes_scheduler_code.md https://mp.weixin.qq.com/s/wQqMu41e8pnLpnAZo0GLow scheduler原理
CUDA Learn
01 向量加 nvcc compiler识别kernel call: add<<<N, 1>>>(); // N block parallel, 1 thread each block 组织:grid, block, thread: block代表一组worker,可以完成一块任务; __global__关键字,会向compiler提示这是一个kernel函数,需要在GPU上运行: __global__ void add(int *a, int *b, int *c) { c[blockIdx.x] = a[blockIdx.x] + b[blockIdx.x]} block的下一级为thread,如下所示为thread parallel: addVec<<<1, N>>>(); // 1 block, N thread parallel each block__global__ void add(int *a, int *b, int *c) { c[th...
SGLang
资料 https://lmsys.org/blog/2024-01-17-sglang/ https://arxiv.org/pdf/2312.07104 https://lmsys.org/blog/2024-07-25-sglang-llama3/ https://flashinfer.ai/ https://flashinfer.ai/2024/02/02/introduce-flashinfer.html https://github.com/flashinfer-ai/flashinfer
Tritonserver
调研文档【金山文档 | WPS云文档】 Tritonserver_TensorRT-LLM调研 https://365.kdocs.cn/l/cqu1Q0RUtYog 【金山文档 | WPS云文档】 TRTLLM LLaMa 7B 4090测试数据 https://365.kdocs.cn/l/cqAXum4uoqmf in-flight batching in-flight batching在业内也被称为continuous batching, iteration-level batchingTRTLLM triton backend inflight batching使用:https://github.com/triton-inference-server/tensorrtllm_backend/blob/main/inflight_batcher_llm/README.md TRTLLM Batch Manager资料 https://nvidia.github.io/TensorRT-LLM/advanced/batch-manager.html#the-batch-m...
TRTLLM架构
资料 https://nvidia.github.io/TensorRT-LLM/architecture/overview.html 架构介绍 本质上是python包了C++,C++基于TensorRT引擎实现了GPT等模型结构; 除模型本身的搭建外,TRTLLM还提供了C++ GPTRuntime,该模块提供了高效的GPT类模型的TRT运行时,如包含了beam-search, top-k采样, kvcache, page-attention等; 还提供了一个tritonserver backend用于LLM在线推理; 模型Definition TRTLLM通过pyding11暴露的TensorRT Python级API来搭建模型; tensorrt_llm.Builder类包含了tensorrt.Builder对象,通过tensorrt_llm.Builder.create_network函数创建一个tensorrt.INetworkDefinition模型对象; 在TRTLLM中,可以基于tensorrt_llm.functional模块提供的基础算子库来构建模型网络结...
k8s device-plugin
k8s device-plugin机制docker运行GPU容器 nvidia的GPU容器镜像原理是:NVIDIA驱动相对更稳定,因此容器中使用容器封装的CUDA/SDK库,共用宿主机的NVIDIA驱动; docker运行GPU容器时,需要将NVIDIA驱动映射到容器内:# 以下的命令与nvidia-docker同样的作用原理docker run --it --volume=navidia_driver_xxx.xx:/usr/local/nvidia:ro \ --device=/dev/nvidiactl \ --device=/dev/nvidia-uvm \ --device=/dev/nvidia-uvm-tools \ --device=/dev/nvidia0 \ nvidia/cuda nvidia-smi k8s 运行GPU容器 安装NVIDIA驱动; 安装NVIDIA Dcoker:nvidia-docker2 部署NVIDIA Device Plugin:device-nvidia-plugin k8s GPU资源...
Go Knowledge
Go init资料 https://cloud.tencent.com/developer/article/2138066 说明 Go的总体初始化过程如下图所示: 同模块中,优先级:const常量 > var变量 > init() 同模块中,前后init()的优先级,为从上到下顺序执行 同包中,不同模块的init()优先级:按文件名排序依次执行不同模块的init() import导入包init()顺序:被导入包的init()先执行
etcd
资料 ETCD事件推送:https://www.lixueduan.com/posts/etcd/05-watch/
pod
pod内容器共享空间资料 https://www.cnblogs.com/rexcheny/p/11017146.html https://linchpiner.github.io/k8s-multi-container-pods.html 问题 k8s的pod内可以同时容纳多个容器,那这些容器之间有哪些资源(命名空间)是可以共享的? 答案 容器的隔离技术是通过cgroup和namespace隔离实现,linux支持namespace有: UTS名称空间,保存内核版本,主机名,域名 NET空间,通过逻辑网络栈实现网络空间的隔离 进程PID空间,通过fork时指定的一个参数控制,不同空间间的PID是隔离了,看不到彼此的PID,子空间看不到父空间的内容,但父空间可以管理子空间,如发送信息 IPC空间,即进程间通信的隔离,不同容器之间无法通过如信号量,队列,共享内存(System V IPC和POSIX消息队列),来实现进程间通信 USER空间,实现用户,组相关功能的隔离 MNT空间,即磁盘挂载点和文件系统的隔离能力,同一主机上的不同进程访问相同的路径能看到相同的内容,是因为...
probe
Readiness, Liveness, StartupProbe执行原理 均支持三种检测探针:TCP, HTTP, Exec Shell 探针的执行均由kubelet组件执行; Exec探针执行 由kubelet组件调用CRI接口的ExecSync接口,在对应的容器内执对应的cmd命令,获取其返回值; func (pb *prober) runProbe(p *v1.Probe, pod *v1.Pod, status v1.PodStatus, container v1.Container, containerID kubecontainer.ContainerID) (probe.Result, string, error) { ... command := kubecontainer.ExpandContainerCommandOnlyStatic(p.Exec.Command, container.Env) return pb.exec.Probe(pb.newExecInContainer(container, conta...
k8s client-go
client k8s client-go提供4个client:RESTClient, ClientSet, DynamicClient, DiscoveryClient RESTClient 作为另外三类client的基类,提供与k8s apiserver的底层API请求构造与请求; ClientSet 用于方便访问k8s内置api group资源的client,如deployment, pod等; DynamicClient 通过指定资源组,资源版本即可操作k8s中的任务资源,包括CRD和内置资源; DynamicClient使用嵌套的map[string]interface{}结构来存储k8s apiserver的返回资源结构,通过反射机制,在运行时进行数据绑定; DiscoveryClient 与前面三种client不同,该client不是用于管理k8s资源对象的,该client是用于查询k8s支持的GVR资源类型的,与kubectl api-versions和kubectl api-resources返回的资源内容相关; Informer...
raft
资料 https://raft.github.io/ 特点 随机超时:避免同时发起选举请求 任期Term:用于标记选举任期,可用于让故障回复后的leader变成follower,任期小的选举请求会被拒绝; 角色:leader, follower, candidate leader选择出来后,leader会定时向follower发起心跳,如心跳超时,则最先timeout的节点会发起选举请求,此时该节点会从follower转变成cadidate;
vGPU Research
资料 Time-Slicing Sharing: https://developer.nvidia.com/blog/improving-gpu-utilization-in-kubernetes MPS:https://docs.nvidia.com/deploy/mps/index.html MPS MPS(Multi-Process Service)是CUDA应用编程API的一个可替换的、二进制兼容的实现,其运行时架构是设计用于透明的处理多CUDA进程的协作/交互,如MPI任务; 该技术利用了NVIDIA GPU的Hyper-Q能力,Hyper-Q允许CUDA kernel在同一个GPU上并行处理; Volta MPS Volta MPS相对于之前的构架,在MPS上有较大变化,主要表现为: Volta MPS client可以直接向GPU提交任务,而无需再经过MPS Server; 每个Volta MPS client都拥有其自己的GPU地址空间,而不是与其它MPS client共享一个地址空间; Volta MPS支持了有限的计算资源配置,以提供QoS;...
容器网络和cni
容器网络 https://zhuanlan.zhihu.com/p/364886965 https://outmanzzq.github.io/2019/10/22/docker-network/#22-container https://tonybai.com/2017/01/11/understanding-linux-network-namespace-for-docker-network/ docker网络模式 默认创建如下四种:bridge, host, none, containerhbb@hbb:~$ docker network lsNETWORK ID NAME DRIVER SCOPE3c92bea4cc95 bridge bridge local3d964312d0b5 host host local07d5e640e74f none null local bridge模式为默认容器模式,所有容器均会创建一对虚拟网络接口,容器内一个eth0,容器外一个vethXXX...
Go Channel
原理 本质上,channel是一个包含:发送Go队列,接收Go队列,由循环数组实现的缓存数据队列,锁这几个元素组成的结构体实现; sendmsg阶段: 如果接收Go队列有值,则直接进行值元素的内存拷贝,并唤醒接收队列; 如有缓冲队列且未满,则将值复制到循环队列中; 如果有缓冲队列且满了或无缓冲队列,将协程放到channel的sendqueue中; recvmsg阶段: 如果缓冲,且无数据,则进入recvqueue中,协程挂起(gopack); 如果缓冲队列中数据,由从队列中将值拷贝给当前接收者; 如果sendqueue有协程,则说明缓冲队列已满,则从缓冲队列中取值,并将sendqueue中取一个协程,将其值拷贝到缓冲循环数组中; 上述操作是在mutex锁下进行,所以channel是协程安全的;