- 更低的延迟:相比 fastswap,有6倍吞吐的提升
- 更高的灵活性:用户可以显式指定一块内存是local还是far(指向 remote memory)
Distributed Shared Persistent Memory
1. 场景
2. DSPM 的挑战
Mix Precision Training 混合精度训练
- Binaryconnect: Training deep neural networks withbinary weights during propagations @2015
- Binarized neural networks. InAdvances in Neural Information Processing Systems @2016
1. 背景
Year
|
Name
|
Param
|
From
|
2018
|
110M
|
OpenAI
|
|
2018
|
349M
|
Google
|
|
2020
|
175B
|
OpenAI
|
|
2022
|
540B
|
Google
|
2. 实现
- 大幅减少内存消耗:50%?
- 运算加速,FP16肯定要比FP32要快
阿里云 GPU Sharing in Kubernetes
阿里云的 gpu sharing 只是实现了资源的按需分配和调度,并没有解决算力 & 显存隔离的问题
基于k8s原生的Scheduler Extender、Extended Resource、DevicePlugin机制来实现
提供2个接口:
- aliyun.com/gpu-mem: 单位从 number of GPUs 变更为 amount of GPU memory in MiB,如果一个Node有多个GPU设备,这里计算的是总的GPU Memory
- aliyun.com/gpu-count:对应于Node上的GPU 设备的数目
整体架构:
vm template 原理浅析
1. 背景
2. vm template 原理
RunD – A Lightweight Secure Container Runtime
1. 设计目标
2. 问题分析
2.1 并发启动的开销
2.2 高密部署的瓶颈
kata 系统架构解读
https://github.com/kata-containers/kata-containers/tree/main/docs/design/architecture
https://github.com/kata-containers/kata-containers/tree/main/docs/design
1. 整体架构
如下图:
kata-containers 的核心 binary 就2个:
- containerd-shim-kata-v2,对应源代码目录 src/runtime
- kata-agent,对应源码目录 src/agent
containerd 实现了 cri 协议,可以天然直接无缝对接到 kublet 上,而 containerd-shim-kata-v2 实现了 containerd 的 shim-v2 协议,直接实现了对 kata-agent 以及 hypervisor 通讯的封装。
nr_dying_descendants 引发的在线业务性能抖动
最近发现一则比较奇怪的业务性能抖动问题
简单来说,就是离线作业频繁的触发oom,导致在线业务指标陡增。理论上来说,离线作业触发自身硬限,不应该导致其他容器出问题才是
先来说一下我们的 memory cgroup 层级结构,可以简单理解为如下:
/cgroups/v2/kubepods/
/cgroups/v2/kubepods/online/a -> a为在线服务
/cgroups/v2/kubepods/offline/job1 -> job1 为离线服务
通常来说,为了解决混部的内存争抢问题,我们会对整个 offline 大框设置一个内存上限,防止离线作业使用内存太多,导致在线服务出现内存压力。这看起来似乎没什么问题。
不过最近一个问题,发现离线 job1 频繁 oom,引发了在线的性能抖动
最后定位的结论如下:
- /cgroups/v2/kubepods/offline/cgroup.stat 下看到有大量的 nr_dying_descendants
- offline 大框频繁出发 oom
- oom 的回收过程有个效率不太好的地方,导致 oom 回收效率底下 -> 导致内核各种锁争抢严重 -> 进程sys高 -> cpu排队严重 -> 在线业务性能抖动
根因分析:nr_dying_descendants 的原因是由于容器被销毁时,容器内还有未完全回收干净的 page cache,所以内核不会立即释放这个 cgroup(用户态操作系统从 /cgroups 文件系统下已经看不到了,但是内核态的数据结构还在)
cat /cgroups/v2/kubepods/online/cgroup.stat
nr_descendants 10
nr_dying_descendants 4172
这就有一个问题,如果有大量的dying cgroups,内核在oom处理过程中:
- 如果是cgroup oom,会优先尝试从 dying cgroups 回收内存,但是最多只回收5个 -> 这个地方有效率问题
- 如果是整机回收,不处理dying cgroups内存
TMO – Transparent Memory Offloading in Datacenters
1. INTRODUCTION
- google的方案,g-swap
- facebook的方案,tmo
- 核心是压缩
- 非常简单
- 好处:不用解决异构这些复杂的问题(感觉解决了?做了负载分类)
- 坏处:不利于最大化的 memory-cost saving
- promotion rate 的设定依赖离线分析
- 所有应用的 promotion rate 是一样的。没有考虑不同业务对内存的敏感性,以及不同分层设备的 performance(后者其实有简单的考虑,具体的 P% 的设备就取决于 far memory 到 near memory 的性能表现)
- g-swap的观点:为了保证应用程序的性能,memory offloading 应该控制在一个预先配置好的比例下面
- tmo的观点:facebook 对它们部署规模最大的程序,发现,在一些高速设备上,提高 memory offloading 比例,可以提高性能。 –> 反人类假设??
- 核心是卸载(但是卸载的backend 支持 compressed memory pool,也支持 NVMe SSDs)
- 不需要离线分析,依赖 PSI 的反馈,直接单机决定不同的 offloading 比例。不依赖app的任何先验知识(g-swap的方案就有一个冷启动问题,新app默认不回收任何内存)
- PSI accounts for application’s sensitivity to memory-access slowdown(这里其实是比较误导的,facebook认为psi观测出来的内存延迟一定是对业务敏感的,但是实际上不同的业务对延迟的敏感性是不一样的,简单来说这个是充分不必要条件)
How to install cuda and pytorch dev environment on thinkpad w530 & ubuntu 20.04
最近发现在笔记本上用 cpu 来训练模型效率还是太慢了,正好我笔记本上有一块 nvidia gpu,准备折腾一下把这块 gpu 用起来
由于在笔记本环境下安装 gpu 开发环境比较痛苦,虽然最终失败了,但是过程比较有意义,值得备忘一下
我的开发环境主要是 pytorch + cuda
硬件环境就是 thinkpad w530 + 32g + K1000M
由于笔记本的 gpu 通常型号比较老,并不是大部分的 pytorch 都支持
1. 安装 cuda
网上有很多资料,怎么安装 nvidia-cuda-toolkit 的,apt install nvidia-cuda-toolkit 就可以直接装
但是我发现装完了之后没法用,pytorch 没法检测到 cuda 环境。这两个东西不完全是一个东西,有挺多差异的。
python3 -c ‘import torch; print(torch.cuda.is_available())’ 必须返回 true
最后用官方的安装方法成功了
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-ubuntu2004.pin sudo mv cuda-ubuntu2004.pin /etc/apt/preferences.d/cuda-repository-pin-600 wget https://developer.download.nvidia.com/compute/cuda/11.7.0/local_installers/cuda-repo-ubuntu2004-11-7-local_11.7.0-515.43.04-1_amd64.deb sudo dpkg -i cuda-repo-ubuntu2004-11-7-local_11.7.0-515.43.04-1_amd64.deb sudo cp /var/cuda-repo-ubuntu2004-11-7-local/cuda-*-keyring.gpg /usr/share/keyrings/ sudo apt-get update sudo apt-get -y install cuda
2. 安装 nvidia-driver
ubuntu 默认源里面会有一些基本的 nvidia-driver
ubuntu-drivers devices 可以看到
# ubuntu-drivers devices == /sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0 == modalias : pci:v000010DEd00000FFCsv000017AAsd000021F5bc03sc00i00 vendor : NVIDIA Corporation model : GK107GLM [Quadro K1000M] manual_install: True driver : nvidia-driver-390 - distro non-free driver : nvidia-340 - distro non-free recommended driver : nvidia-driver-418-server - distro non-free driver : xserver-xorg-video-nouveau - distro free builtin
这里面会推荐你使用 nvidia-340
但是我的实际测试来看,nvidia-340是没法用的,安装完了之后显示器各种异常,最后安装到 nvidia-driver-390 解决了显示器异常的问题
但是nvidia-driver-390 版本太低,cuda 现在依赖的 nvidia-driver 版本都是470以上了,所以光有 nvidia-driver 是不行的,必须和 cuda 配套。
最终在安装 cuda 的时候会自动安装 nvidia-driver 配套驱动,其实不用自己搞
安装完,需要重启机器,重启后 nvidia-smi 检查能不能看到显卡信息