K8S调用GPU资源配置指南

2023-11-13

06-09 K8S调用GPU资源配置指南
时间 版本号 修改描述 修改人
2022年6月9日15:33:12 V0.1 新建K8S调用GPU资源配置指南,
编写了Nvidia驱动安装过程
2022年6月10日11:16:52 V0.2 添加K8S容器编排调用GPU撰写

简介

文档描述

 该文档用于描述使用Kubernetes调用GPU资源的配置过程。文档会较为详细的描述在配置过程中遇到的问题和解决方式,并且会详细描述每个步骤的验证结果,该文档对于Kubernetes的使用以及GPU资源的理解有一定的辅助意义。在行文时主要描述了TensorFlow框架调用GPU、也有Pytorch调用GPU支持的过程,文档适用于运维人员、开发人员。

配置目标描述

 配置过程的主要目标是实现通过yaml文件实现对于底层GPU资源的调度。为达到此目的,需要实现如下的目标:

  • 完成Nvidia GPU驱动程序的安装
  • 通过Tensorflow框架示例程序验证驱动程序安装成功,即验证Docker容器对于GPU资源的调用
  • 完成k8s-device-plugin的安装
  • 通过示例程序验证k8s-device-plugin启动成功,即验证k8s容器编排下对于GPU资源的调用

整体架构

Docker 使用容器创建虚拟环境,以便将 TensorFlow 安装结果与系统的其余部分隔离开来。TensorFlow 程序在此虚拟环境中运行,该环境能够与其主机共享资源(访问目录、使用 GPU、连接到互联网等)。行文中,可以理解,nvidia-docker2的驱动安装在每个GPU节点上。而k8s-device-plugin为k8spod网络访问GPU的资源,这也是通过驱动nvidia-docker2实现的。

环境简介

 当前环境,共两个服务器,每台服务器有8张卡,可以通过命令查看nvidia-smi查看型号NVIDIA A100-SXM4-40GB。具体如下

root@node33-a100:/mnt/nas# nvidia-smi 
Thu Jun  9 07:34:17 2022       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 470.129.06   Driver Version: 470.129.06   CUDA Version: 11.4     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  NVIDIA A100-SXM...  Off  | 00000000:07:00.0 Off |                    0 |
| N/A   28C    P0    59W / 400W |  31922MiB / 39538MiB |      0%      Default |
|                               |                      |             Disabled |
+-------------------------------+----------------------+----------------------+
|   1  NVIDIA A100-SXM...  Off  | 00000000:0A:00.0 Off |                    0 |
| N/A   24C    P0    58W / 400W |  32724MiB / 39538MiB |      0%      Default |
|                               |                      |             Disabled |
+-------------------------------+----------------------+----------------------+
|   2  NVIDIA A100-SXM...  Off  | 00000000:47:00.0 Off |                    0 |
| N/A   34C    P0   183W / 400W |  26509MiB / 39538MiB |     58%      Default |
|                               |                      |             Disabled |
+-------------------------------+----------------------+----------------------+
|   3  NVIDIA A100-SXM...  Off  | 00000000:4D:00.0 Off |                    0 |
| N/A   31C    P0    83W / 400W |  14036MiB / 39538MiB |     15%      Default |
|                               |                      |             Disabled |
+-------------------------------+----------------------+----------------------+
|   4  NVIDIA A100-SXM...  Off  | 00000000:87:00.0 Off |                    0 |
| N/A   29C    P0    75W / 400W |  24175MiB / 39538MiB |     26%      Default |
|                               |                      |             Disabled |
+-------------------------------+----------------------+----------------------+
|   5  NVIDIA A100-SXM...  Off  | 00000000:8D:00.0 Off |                    0 |
| N/A   25C    P0    60W / 400W |  31039MiB / 39538MiB |     31%      Default |
|                               |                      |             Disabled |
+-------------------------------+----------------------+----------------------+
|   6  NVIDIA A100-SXM...  Off  | 00000000:C7:00.0 Off |                    0 |
| N/A   24C    P0    58W / 400W |  31397MiB / 39538MiB |     11%      Default |
|                               |                      |             Disabled |
+-------------------------------+----------------------+----------------------+
|   7  NVIDIA A100-SXM...  Off  | 00000000:CA:00.0 Off |                    0 |
| N/A   28C    P0    61W / 400W |  26737MiB / 39538MiB |     20%      Default |
|                               |                      |             Disabled |
+-------------------------------+----------------------+----------------------+
   

 上述输出的各项指标可以参见下图:

img

 nvidia-smi的用法可以参见Nvidia-smi简介及常用指令及其参数说明

 两台Ubuntu组成了K8S集群。

root@node33-a100:/mnt/nas# kubectl get nodes
NAME          STATUS   ROLES    AGE   VERSION
node33-a100   Ready    master   15d   v1.18.2
node34-a100   Ready    <none>   15d   v1.18.2

NVIDIA 驱动架构

配置步骤

 为了使用系统支持多版本TensorFlow,使用Docker容器环境来隔离不同版本是非常简单高效的方式。首先我们在部署了k8s的两个节点上(当然已经安装了Docker运行环境)。根据docker版本,在TensorFlow官网上指引我们要安装Nvidia 驱动。

root@node33-a100:~/gpu# docker version
Client: Docker Engine - Community
 Version:           19.03.13
 API version:       1.40
 Go version:        go1.13.15
 Git commit:        4484c46d9d
 Built:             Wed Sep 16 17:02:36 2020
 OS/Arch:           linux/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          19.03.13
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.13.15
  Git commit:       4484c46d9d
  Built:            Wed Sep 16 17:01:06 2020
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.4.3
  GitCommit:        269548fa27e0089a8b8278fc4fc781d7f65a939b
 nvidia:
  Version:          1.0.0-rc92
  GitCommit:        ff819c7e9184c13b7c2607fe6c30ae19403a7aff
 docker-init:
  Version:          0.18.0
  GitCommit:        fec3683

 然后可以通过TensorFlow官网上的例子,来验证使用Docker容器TensorFlow访问GPU是否实现。

image-20220609164922443

TensorFlow调用GPU

Nvidia驱动安装

Nvidia驱动的安装是在所有GPU节点都安装

 由于两个节点的操作系统为Ubuntu,因此我们可以参考Ubuntu环境安装Nvidia驱动的安装手册Installation Guide

root@node33-a100:~/gpu# cat /etc/lsb-release 
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=18.04
DISTRIB_CODENAME=bionic
DISTRIB_DESCRIPTION="Ubuntu 18.04.6 LTS"

 安装稳定版本,设置包仓库和GPG key:

# distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \
      && curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \
      && curl -s -L https://nvidia.github.io/libnvidia-container/$distribution/libnvidia-container.list | \
            sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
            sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list

 更新包访问列表,并安装nvidia-docker2

# sudo apt-get update
# sudo apt-get install -y nvidia-docker2

 在执行过程中,会出现提示是否覆盖/etc/docker/daemon.json的内容,此时注意备份,可以把daemon.json的内容和新生成的合成一体。最后的daemon.json文件内容如下所示:

image-20220609170024371

 重启Docker完成安装

# systemctl restart docker

安装过程问题描述

Reading from proxy failed

 不知实验室网络架构,当时在执行apt-get update时,出现了如下问题:

Reading from proxy failed - read (115: Operation now in progress) [IP: *.*.*.* 443]

 管理节点上执行apt-get-update可以比较顺畅的更新包列表,但是另外一个节点死活就是遇到上述的问题。当时该问题困扰了许久,尝试了另外几个节点,两个云主机可以正常执行update操作,但另外的一个k8s节点无法执行。不过不断的浏览网页最终采用禁用代理的方式解决。

image-20220609171457499

apt无法获得锁

 在执行安装时,出现无法活得锁的问题,参见apt install的lock问题

 解决方式如下:

image-20220609172003006

unboxed as root as file /root/iscos/depends/deb/InRelease

 这是由于两台服务器的K8s集群采用的是指令集系统本地安装导致的,解决方式是删除了/etc/apt/的local本地源文件。

程序验证

Nvidia官网例子

 在Installation Guide可以看到一个验证例子

# docker run --rm --gpus all nvidia/cuda:11.0.3-base-ubuntu20.04 nvidia-smi

 能够正常打印GPU显卡信息,表明可以正确访问。

多版本TensorFlow支持

 为了验证对于多个TensorFlow版本支持,本次选用了Tensorflow2和1两个版本进行验证,首先下载两个镜像:

# docker pull tensorflow/tensorflow:2.9.1-gpu
# docker pull tensorflow/tensorflow:1.15.5-gpu

 使用TensorFlow官网的例子,

# docker run -it --rm tensorflow/tensorflow:2.9.1-gpu python -c "import tensorflow as tf; print(tf.reduce_sum(tf.random.normal([1000, 1000])))"
2022-06-09 09:30:00.944529: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1532] Created device /job:localhost/replica:0/task:0/device:GPU:6 with 6026 MB memory:  -> device: 6, name: NVIDIA A100-SXM4-40GB, pci bus id: 0000:c7:00.0, compute capability: 8.0
2022-06-09 09:30:00.949071: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1532] Created device /job:localhost/replica:0/task:0/device:GPU:7 with 10598 MB memory:  -> device: 7, name: NVIDIA A100-SXM4-40GB, pci bus id: 0000:ca:00.0, compute capability: 8.0
tf.Tensor(-921.5332, shape=(), dtype=float32)

如果能像上述控制台输出tf.Tensor()则表示驱动安装成功。

 上述采用了直接启动容器在容器中执行命令的方式,也可以采用如下的方式在控制台与容器交互,打印所有的GPU设备的方式来验证驱动安装的成功。

image-20220609173816318

image-20220609173856263

 最后,也可以在交互时采用指定GPU的方式进行验证:

image-20220609174028367

 也可以进行接口验证:

# print (tf.test.is_gpu_available())
# tf.random.normal([2, 2])

 不再赘述。

K8S容器编排调用GPU

k8s-device-plugin的项目地址位于GitHub。安装的过程参考README.md.

注意:一定要确保/etc/docker/daemon.json中默认low-level运行时。

{
    "default-runtime": "nvidia",
    "runtimes": {
        "nvidia": {
            "path": "/usr/bin/nvidia-container-runtime",
            "runtimeArgs": []
        }
    }
}

安装k8s-device-plugin.

 当在k8s集群中所有的GPU节点上配置了nvidia驱动之后,可以通过部署下面的Daemonset来启动GPU支持。

 在k8s管理节点上执行如下程序:

# wget https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/v0.12.0/nvidia-device-plugin.yml
# kubectl create -f nvidia-device-plugin.yml

注意:可以简单的使用kubectl create 来部署k8s-device-plugin插件,不过官方更加推荐使用helm来部署该插件,不过在此不表了。操作了一下,也是可以实现的,需要注意的是,上述kubectl create与helm是并列关系,两者选其中一种方式即可。

 使用如下命令查看插件是否运行

root@node33-a100:~/gpu# kubectl get pods -n kube-system
NAME                                   READY   STATUS    RESTARTS   AGE
coredns-66bff467f8-q7pks               1/1     Running   8          15d
coredns-66bff467f8-wtm8j               1/1     Running   8          15d
etcd-node33-a100                       1/1     Running   9          15d
kube-apiserver-node33-a100             1/1     Running   8          15d
kube-controller-manager-node33-a100    1/1     Running   11         15d
kube-flannel-ds-amd64-6zl2n            1/1     Running   3          3h12m
kube-flannel-ds-amd64-vl84w            1/1     Running   763        8d
kube-proxy-5nmt2                       1/1     Running   9          15d
kube-proxy-j9k96                       1/1     Running   8          15d
kube-scheduler-node33-a100             1/1     Running   11         15d
nvidia-device-plugin-daemonset-9tfhr   1/1     Running   0          7d1h
nvidia-device-plugin-daemonset-p27ph   1/1     Running   0          7d1h

可以看到,在k8s及群众中,两个GPU节点上都运行了nvidia-device-plugin-daemonset,其中使用的镜像就是

image: nvcr.io/nvidia/k8s-device-plugin:v0.11.0

 此时,一定要通过kubectl logs查看一下插件是否启动,通过上面的控制台输出,可以看到该Daemonset位于命名空间kube-system。

root@node33-a100:~/gpu# kubectl logs nvidia-device-plugin-daemonset-p27ph
Error from server (NotFound): pods "nvidia-device-plugin-daemonset-p27ph" not found
root@node33-a100:~/gpu# kubectl logs nvidia-device-plugin-daemonset-p27ph -n kube-system
2022/06/02 09:40:59 Loading NVML
2022/06/02 09:40:59 Starting FS watcher.
2022/06/02 09:40:59 Starting OS watcher.
2022/06/02 09:40:59 Retreiving plugins.
2022/06/02 09:40:59 Starting GRPC server for 'nvidia.com/gpu'
2022/06/02 09:40:59 Starting to serve 'nvidia.com/gpu' on /var/lib/kubelet/device-plugins/nvidia-gpu.sock
2022/06/02 09:40:59 Registered device plugin for 'nvidia.com/gpu' with Kubelet

注意: 对于不在默认命名空间下的pod,查看pod启动日志,需要通过-n指定命名空间,不然会报错。

 然后使用kubectl-describe来检查一下显示一下特定资源或者资源组的细节。

root@node33-a100:~/gpu# kubectl describe pod nvidia-device-plugin-daemonset-p27ph -n kube-system 
Name:                 nvidia-device-plugin-daemonset-p27ph
Namespace:            kube-system
Conditions:
  Type              Status
  Initialized       True 
  Ready             True 
  ContainersReady   True 
  PodScheduled      True 
QoS Class:       BestEffort
Node-Selectors:  <none>
Tolerations:     CriticalAddonsOnly
                 node.kubernetes.io/disk-pressure:NoSchedule
                 node.kubernetes.io/memory-pressure:NoSchedule
                 node.kubernetes.io/not-ready:NoExecute
                 node.kubernetes.io/pid-pressure:NoSchedule
                 node.kubernetes.io/unreachable:NoExecute
                 node.kubernetes.io/unschedulable:NoSchedule
                 nvidia.com/gpu:NoSchedule
Events:          <none>

 为了信息的显著,上面的控制台信息有删减。可以从上述的控制台输出中查看到Conditions的输出中,判断该插件正常运行。

 另外,我们也可以通过docker命令来直接查看nvidia-device-plugin容器的启动日志

root@node33-a100:~/gpu# docker ps -f name=nvidia
CONTAINER ID        IMAGE                  COMMAND                  CREATED             STATUS              PORTS               NAMES
6af0cf230428        6bf6d481d77e           "nvidia-device-plugi…"   7 days ago          Up 7 days                               k8s_nvidia-device-plugin-ctr_nvidia-device-plugin-daemonset-9tfhr_kube-system_58bb23d9-7692-44be-86ef-d815a7061b21_0
c8103716e8dd        k8s.gcr.io/pause:3.2   "/pause"                 7 days ago          Up 7 days                               k8s_POD_nvidia-device-plugin-daemonset-9tfhr_kube-system_58bb23d9-7692-44be-86ef-d815a7061b21_0
root@node33-a100:~/gpu# docker logs 6af
2022/06/02 09:40:59 Loading NVML
2022/06/02 09:40:59 Starting FS watcher.
2022/06/02 09:40:59 Starting OS watcher.
2022/06/02 09:40:59 Retreiving plugins.
2022/06/02 09:40:59 Starting GRPC server for 'nvidia.com/gpu'
2022/06/02 09:40:59 Starting to serve 'nvidia.com/gpu' on /var/lib/kubelet/device-plugins/nvidia-gpu.sock
2022/06/02 09:41:00 Registered device plugin for 'nvidia.com/gpu' with Kubelet

 可以看到,Docker容器的日志,与kubectl查看pods日志的输出一致。

k8s-device-plugin插件安装问题

Error from server (NotFound)

 这是由于在使用kubect describe或者kubectl logs查询指定资源的信息或者日志时,默认是在default命名空间下查询的。

 解决方式,添加pod对应的命名空间即可。

root@node33-a100:~/gpu# kubectl get pods nvidia-device-plugin-daemonset-9tfhr
Error from server (NotFound): pods "nvidia-device-plugin-daemonset-9tfhr" not found
root@node33-a100:~/gpu# kubectl get pods nvidia-device-plugin-daemonset-9tfhr -n kube-system
NAME                                   READY   STATUS    RESTARTS   AGE
nvidia-device-plugin-daemonset-9tfhr   1/1     Running   0          7d16h
root@node33-a100:~/gpu# kubectl logs nvidia-device-plugin-daemonset-9tfhr --namespace kube-system
2022/06/02 09:40:59 Loading NVML
2022/06/02 09:40:59 Starting FS watcher.
2022/06/02 09:40:59 Starting OS watcher.
2022/06/02 09:40:59 Retreiving plugins.
2022/06/02 09:40:59 Starting GRPC server for 'nvidia.com/gpu'
2022/06/02 09:40:59 Starting to serve 'nvidia.com/gpu' on /var/lib/kubelet/device-plugins/nvidia-gpu.sock
2022/06/02 09:41:00 Registered device plugin for 'nvidia.com/gpu' with Kubelet
Insufficient nvidia.com/gpu

 在使用kubectl logs查询插件的日志时,出现了如下问题:

image-20220610103023756

 当出现这个问题时,请仔细检查一下是否配置了nvidia默认运行时,检查/etc/docker/daemon.json

  {
  "default-runtime": "nvidia",
  "runtimes": {
      "nvidia": {
          "path": "/usr/bin/nvidia-container-runtime",
          "runtimeArgs": []
      }
  }

 检查之后,记得重启每一个GPU节点,然后重启Docker服务,不再赘述了。

 另外,该问题在GitHub上也有其他人遇到。

程序验证

Tensorflow调用GPU

 使用如下的yaml文件,来访问GPU资源。下面代码申请了一个GPU资源,调用了并且打印了GPU显卡信息和一个一个张量。

apiVersion: v1
kind: Pod
metadata:
  name: gpu-pod
spec:
  containers:
  - name: tf-test
    image: tensorflow/tensorflow:2.9.1-gpu
    command:
    - python
    - -c
    - "import tensorflow as tf; print(tf.reduce_sum(tf.random.normal([1000, 1000]))); gpus = tf.config.experimental.list_physical_devices(device_type='GPU'); print(gpus)"
    resources:
      limits:
        nvidia.com/gpu: 1
  tolerations:
  - effect: NoSchedule
    operator: Exists

 使用命令创建pod

root@node33-a100:~/gpu# kubectl create -f gpu_job.yaml 
pod/gpu-pod created

 查看pod运行日志

root@node33-a100:~/gpu# kubectl logs gpu-pod 
2022-06-10 02:50:20.852512: I tensorflow/core/platform/cpu_feature_guard.cc:193] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN) to use the following CPU instructions in performance-critical operations:  AVX2 FMA
To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags.
2022-06-10 02:50:21.515055: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1532] Created device /job:localhost/replica:0/task:0/device:GPU:0 with 5501 MB memory:  -> device: 0, name: NVIDIA A100-SXM4-40GB, pci bus id: 0000:07:00.0, compute capability: 8.0
tf.Tensor(-508.727, shape=(), dtype=float32)
[PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU')]

 发现已经使用GPU:0号设备,并且打印了tf.Tensor张量。由于在启动Pod时,采用了Command的形式,当该命令执行完成,该Pod处于Completed状态。

Pytorch调用GPU

 首先也是在集群中每个节点安装pytorch/pytorch:latest。

 使用如下的yaml来验证Pytroch对于GPU资源的使用

apiVersion: v1
kind: Pod
metadata:
  name: pytorch-gpu
  labels:
    test-gpu: "true"
spec:
  containers:
  - name: training
    image: pytorch/pytorch:latest
    Command:
    - python
    - -c
    - "import torch as torch; print('gpu available', torch.cuda.is_available());print(torch.cuda.device_count());print(torch.cuda.get_device_name(0))"
    env:
            #    - name: NVIDIA_VISIBLE_DEVICES
            #      value: none
    resources:
      limits:
        nvidia.com/gpu: 1
  tolerations:
  - effect: NoSchedule
    operator: Exists

 上述虽然申请了一个GPU资源,并且打印0号GPU设备的名称。

 使用命令启动该Pod验证pytorch对于GPU资源的可调度性

# kubectl create -f pytorch-gpu.yaml

 查看pod启动日志,如下:

root@node33-a100:~/gpu# kubectl logs pytorch-gpu -f
gpu available True
1
NVIDIA A100-SXM4-40GB

 这与Pod中yaml限额一致,通过输出表明Pytorch框架在k8s集群中可以正确的申请GPU资源。

总结

 文档详细的讲述了为使得K8s集群发现集群中GPU资源而进行的两个配置,首先是在所有GPU节点上配置nvidia驱动nvidia-docker2,然后在k8s集群中配置k8s-device-plugin使得k8s集群可以发现底层GPU资源。通过详细记录在此过程中遇到的问题,并记录在其上建立的思考,完成本文档的撰写。

参考

 本文在行文过程中重点参考的地址如下所示:

下载

 在进行该项工作时,输出的XMind如下所示:
XMind记录配置过程

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

K8S调用GPU资源配置指南 的相关文章

随机推荐

  • 在C++上利用onnxruntime (CUDA)和 opencv 部署模型onnx

    概述 将得到的模型转化为onnx模型 加载到c 中运行 来完成模型的部署 下载并安装onnxruntime CMakeLists txt cmake minimum required VERSION 2 8 project test 使用c
  • 一起学nRF51xx 10 -  rng

    前言 随机数产生器 RNG 的结构 随机数发生器 RNG 根据内部热产生真实的非确定性随机数噪音 RNG通过触发START任务启动 并通过触发STOP任务停止 当随机数已经生成 它会产生一个VALRDY事件 同时把随机数存入VALUE寄存器
  • 智慧城市领域大单,巨头占尽优势

    智慧城市领域 哪个公司做的比较好 一 前言 二 智慧城市中标大单 清单 三 中标厂商分析 1 华为 2 科大讯飞 3 腾讯 4 阿里 5 中国电科 6 中国电子 7 百度 8 数字广东 四 获取 智慧城市等全套最新解决方案合集 一 前言 在
  • python eclipse+pydev(An error has occurred when creating this preference page)

    Eclipse 安装pydev Help gt Install New Software gt add gt Location http pydev org updates 点击pydev左边的小三角勾选pydev for eclipse
  • Shell init Ubuntu

    echo HISTFILESIZE 99999 gt gt bashrc echo HISTSIZE 99999 gt gt bashrc echo HISTTIMEFORMAT F T gt gt bashrc echo PROMPT C
  • Thrift原理简析(JAVA)

    Apache Thrift是一个跨语言的服务框架 本质上为RPC 同时具有序列化 反序列化机制 当我们开发的service需要开放出去的时候 就会遇到跨语言调用的问题 JAVA语言开发了一个UserService用来提供获取用户信息的服务
  • CUDA编程 基础与实践 学习笔记(十)

    线程束 warp 一个GPU由多个SM组成 一个SM上可以放多个线程块 不同线程块之间并行或顺序执行 一个线程块分为多个线程束 一个线程束由32个线程 有连续的线程号 组成 从更细粒度来看 一个SM以一个线程束为单位产生 管理 调度 执行线
  • Java面向对象 - 封装、继承和多态

    第1关 什么是封装 如何使用封装 相关知识 为了完成本关任务 你需要掌握 1 什么是封装 2 封装的意义 3 实现Java封装的步骤 package case1 public class TestPersonDemo public stat
  • GoLang之”奇怪用法“实践总结

    2013 11 23 wcdj 0 摘要 本文通过对A Tour of Go的实践 总结Go语言的基础用法 1 Go语言 奇怪用法 有哪些 1 go的变量声明顺序是 先写变量名 再写类型名 此与C C 的语法孰优孰劣 可见下文解释 http
  • 销售心理学

    销售中的心理学 影响你一生的销售心理学书籍 要想钓到鱼 就要像鱼一样思考 在生活中 如果想钓到鱼 你就得像鱼那样思考 而不是像渔夫那样思考 当你对鱼了解得越多 你也就越来越会钓鱼了 这样的想法用在销售中同样适用 要知道 销售的过程其实就是销
  • 【Redis17】Redis进阶:管道

    Redis进阶 管道 管道是啥 我们做开发的同学们经常会在 Linux 环境中用到管道命令 比如 ps ef grep php 在之前学习 Laravel框架时的 Laravel6 4 管道过滤器https mp weixin qq com
  • Latex使用

    问题 在使用latex的过程中插入图片 在某些条件下 图片可能会出现越过后续的文字出现在下一页的页首 解决办法 在该tex文件首部加上 usepackage stfloats 然后参数设置成H如下 begin figure H center
  • 使用frp 实现内网穿透 & 将私人电脑变成一个服务器

    使用frp 实现内网穿透 frp 是什么 frp 是一个可用于内网穿透的高性能的反向代理应用 支持 tcp udp 协议 为 http 和 https 应用协议提供了额外的能力 且尝试性支持了点对点穿透 作用 比如你需要用到云服务器部署你的
  • 阅读GFS论文

    GFS论文发表距今已经十几年了 据之开源的hdfs也已经在业界得到了广泛应用 为了取得分布式系统的真经 拜读一下这篇经典论文 重要假设 软硬件失败乃家常便饭 我们写大文件 不屑小文件 文件改动的主流是追加新数据 随机写是非主流 一旦写完 仅
  • Neon Instruction C支持的向量运算

    转载请标明出处 https blog csdn net u013752202 article details 92008843 文章目的 快速索引到需要的向量运算 vadd gt ri ai bi 1 Vector add 正常指令 r a
  • pagehelper使用方法及参数说明

    pagehelper使用方法及参数说明 使用方法 Override public PageInfo
  • spring源码--10--IOC高级特性--autowiring实现原理

    spring源码 10 IOC高级特性 autowiring实现原理 1 Spring IoC容器提供了2种方式 管理Bean的依赖关系 1 1 显式管理 通过BeanDefinition的属性值和构造方法实现Bean依赖关系管理 1 2
  • vue学习笔记:在vscode中使用@提示路径

    在vscode中输入 后如果可以智能提示路径 可以有效防止路径名称输入错误 减少不必要的麻烦 效果如下图所示 安装 Path Autocomplete 插件后可以实现路径的智能提示 步骤如下 1 在vscode中查找Path Autocom
  • 关于shell运行python文件中的错误——shell脚本换行

    问题 https ask csdn net questions 7900411 spm 1001 2014 3001 5505 问题由来 由于工程需要在本地window中写 当需要比较少的算力时在本地跑 当需要比较大的算力时就需要在auto
  • K8S调用GPU资源配置指南

    06 09 K8S调用GPU资源配置指南 时间 版本号 修改描述 修改人 2022年6月9日15 33 12 V0 1 新建K8S调用GPU资源配置指南 编写了Nvidia驱动安装过程 2022年6月10日11 16 52 V0 2 添加K