Kubernetes中的GPU共享

构建应用

Scheduler Extender

git clone https://github.com/AliyunContainerService/gpushare-scheduler-extender.git && cd gpushare-scheduler-extender
docker build -t gouchicao/gpushare-scheduler-extender .

Device Plugin

git clone https://github.com/AliyunContainerService/gpushare-device-plugin.git && cd gpushare-device-plugin
docker build -t gouchicao/gpushare-device-plugin .

Kubectl Extension

wget https://github.com/AliyunContainerService/gpushare-device-plugin/releases/download/v0.3.0/kubectl-inspect-gpushare

安装 在控制平面中部署 GPU 共享调度程序扩展器 cd /etc/kubernetes sudo wget https://raw.

AI 模型打包发布

工程目录

model-package-release/
├── Dockerfile
├── Dockerfile.ubuntu
├── main.sh
└── .ssh
    ├── id_rsa
    ├── id_rsa.pub
    └── known_hosts

main.sh #!/usr/bin/sh # 模型和配置文件 FILE_CONFIG=config.yaml FILE_MODEL=model.onnx # 用于构建模型压缩包的目录结构 DIR_MODELS=models if [ -z $1 ] then echo "Usage: " echo "Environment variable:" echo " MODEL_SERVER_USERNAME Default: username" echo " MODEL_SERVER_IP Default: ip" echo "" echo "docker run --rm -v /home/ai/models/sign.yaml:/app/config.yaml \" echo " -v /home/ai/models/sign.onnx:/app/model.

AI 数据集打包发布

数据集打包目录结构

ai-project/
├── labelimg
│   ├── 1.jpg
│   ├── 1.xml
│   ├── 2.jpg
│   ├── 2.xml
│   ├── 3.jpg
│   ├── 3.xml
│   ├── 4.jpg
│   └── 4.xml
├── classes.txt
├── data.yaml
├── images
│   ├── train
│   │   ├── 1.jpg
│   │   └── 2.jpg
│   └── val
│       ├── 3.jpg
│       └── 4.jpg
└── labels
    ├── train
    │   ├── 1.txt
    │   └── 2.txt
    └── val
        ├── 3.txt
        └── 4.txt

打包

DATE=$(date '+%Y-%m-%d')
tar cvf sign-yolo-$DATE.tar labelimg/ classes.txt images/ labels data.yaml

上传数据集服务器

DATASET_SERVER_PATH=username@ip:/data/datasets
scp sign-yolo-$DATE.tar $DATASET_SERVER_PATH

Thonny Python IDE

Thonny

连接 MicroPython 设备进行开发

1. 选择解释器

菜单:运行 -> 选择解释器

2. 打开设备上的文件

菜单:文件 -> 打开

工具栏:打开

单击 MicroPython设备 按钮后,可以看到设备上的文件和目录,选择相应的文件打开。

3. 开发

在编辑器中修改代码,可以保存回 MicroPython 设备。如果需要即时解释执行 Python 语句,只需要在下面的 Shell 窗口输入即可。

4. 上传代码

打开本机上的 Python 代码文件,选择菜单:文件 -> 保存一个副本,选择保存 MicroPython设备。

参考资料

命令base64

编码

macOS

base64 file

Linux

-w, --wrap=COLS wrap encoded lines after COLS character (default 76). Use 0 to disable line wrapping

base64 -w0 file

解码

base64 -d

问题

YWRtaW4= 是 admin 的 base64 编码。

  • 解码(正确,这里之所以正确是因为base64过滤了。)
$ echo 'YWRtaW4=' | base64 -d
admin[username@hostname ~]$
  • 编码(错误,这是因为 echo 输出字符后会在后面再输出换行符。)
$ echo 'admin' | base64
YWRtaW4K

解决方案

  • 方法一:使用 printf 命令。
$ printf 'admin' | base64
YWRtaW4=
  • 方法二:可以通过参数 -n 告诉 echo 不输出换行符。
$ echo -n 'admin' | base64
YWRtaW4=
  • 方法三:可以通过参数 -e 告诉 echo 启用反斜杠转义的解释。
$ echo -e 'admin\c' | base64
YWRtaW4=

可用的转义符(来自 man echo): - \ backslash - \a alert (BEL) - \b backspace - \c produce no further output - \e escape - \f form feed - \n new line - \r carriage return - \t horizontal tab - \v vertical tab - \0NNN byte with octal value NNN (1 to 3 digits) - \xHH byte with hexadecimal value HH (1 to 2 digits)

SSH X11 Forwarding

macOS

XQuartz

  • 安装
brew cask install xquartz
  • 验证
xclock
xeyes

不使用XAuth

$ ssh -Y username@hostname
(base) username@hostname:~$ gedit

使用XAuth

  • 查找XAuth的位置
$ which xauth
/opt/X11/bin/xauth
  • 配置XAuth
$ vim ~/.ssh/config
Host *
    XAuthLocation /opt/X11/bin/xauth
  • SSH登录,可以尝试使用 ssh -X -vv 查看更多的失败信息。
$ ssh -X username@hostname
(base) username@hostname:~$ gedit

参考资料 How To Set Up And Use X11 Forwarding On Linux And Mac What does “Warning: untrusted X11 forwarding setup failed: xauth key data not generated” mean when ssh'ing with -X?

SSH 登录欢迎信息

终端登录时显示给用户的欢迎消息,无论是通过远程 SSH 登录还是直接通过 TTY 或终端,是 motd 的一部分,即 Message Of The Day 守护程序。 通过修改 /etc/update-motd.d 目录中的 /etc/motd 文件或脚本,可以自定义 motd 消息以适合每个用户或管理员的个性化需求。

附加 motd 消息 sudo sh -c 'echo "Hello World!" > /etc/motd' 退出后重新登录 $ ssh username@hostname Welcome to Ubuntu 20.04 LTS (GNU/Linux 5.4.0-53-generic x86_64) * Documentation: https://help.ubuntu.com * Management: https://landscape.canonical.com * Support: https://ubuntu.com/advantage System information as of Thu 29 Apr 2021 08:16:49 AM UTC System load: 7.85 Processes: 1046 Usage of /: 62.1% of 548.

命令helm

Helm 帮助您管理 Kubernetes 应用程序 —— Helm Charts 帮助您定义、安装和升级即使是最复杂的 Kubernetes 应用程序。

安装 Helm

$ curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3
$ chmod 700 get_helm.sh
$ ./get_helm.sh 
Downloading https://get.helm.sh/helm-v3.3.1-linux-amd64.tar.gz
Verifying checksum... Done.
Preparing to install helm into /usr/local/bin
helm installed into /usr/local/bin/helm

Helm 的环境变量 $ helm env HELM_BIN="helm" HELM_CACHE_HOME="/home/username/.cache/helm" HELM_CONFIG_HOME="/home/username/.config/helm" HELM_DATA_HOME="/home/username/.

命令yum

下载软件及依赖安装包

要下载的软件必须是未安装的;不使用downloaddir指定保存目录,下载的软件包将会保存到系统默认缓存目录。

yum install docker-ce --downloadonly --downloaddir=docker-ce

列出软件

列出当前安装的和可安装的最新版本

yum list docker-ce 
已安装的软件包
docker-ce.x86_64                     3:18.09.1-3.el7                     @docker-ce-stable
可安装的软件包
docker-ce.x86_64                     3:20.10.5-3.el7                     docker-ce-stable 

列出软件的所有版本 yum list docker-ce --showduplicates 已安装的软件包 docker-ce.x86_64 3:18.09.1-3.el7 @docker-ce-stable 可安装的软件包 docker-ce.x86_64 17.03.0.ce-1.el7.centos docker-ce-stable ...... docker-ce.x86_64 18.06.3.ce-3.el7 docker-ce-stable docker-ce.x86_64 3:18.09.0-3.el7 docker-ce-stable docker-ce.x86_64 3:18.09.1-3.

容器内幕

容器的本质是一种特殊的进程

  • Linux Namespace - 空间隔离
  • Linux Cgroups - 资源限制
  • chroot - 切换进程的根目录

Linux Namespace

Linux Cgroups - Linux Control Group

作用:限制一个进程组能够使用的资源上限,包括 CPU、内存、磁盘、网络带宽等等。

查看Cgroups限制的资源各类

在 Linux 中,Cgroups 给用户暴露出来的操作接口是文件系统,即它以文件和目录的方式组织在操作系统的 /sys/fs/cgroup 路径下。可以用 mount 指令把它们展示出来。

IoT 硬件:Raspberry Pi Camera

配置

Camera

$ sudo raspi-config
  • 3 Interface Options Configure connections to peripherals
  • P1 Camera Enable/disable connection to the Raspberry Pi Camera
  • Yes
reboot

显存

保证显存 >= 128

  • 查看
$ cat /boot/config.txt | grep gpu_mem
gpu_mem=128
  • 修改
$ vim /boot/config.txt

检测 Camera

如果没有检测出来,可以考虑重新插拔试试。

$ vcgencmd get_camera
supported=1 detected=1

验证

拍照 raspistill

  • 打开摄像头,预览2秒后关闭。
raspistill -t 2000
  • 打开摄像头,5秒后拍照(默认),保存为 image.jpg。
raspistill -o image.jpg
  • 打开摄像头,3秒后拍照,保存为 image.png,宽640:高480。
raspistill -t 3000 -o image.png -e png -w 640 -h 480
  • 打开摄像头,30秒内每2秒保存一张照片。
raspistill -t 30000 -tl 2000 -o image%04d.jpg

IoT 硬件:Raspberry Pi ReSpeaker 智能语音识别双麦克风阵列

树莓派4

硬件概述

烧录系统

wget https://downloads.raspberrypi.org/rpd_x86/images/rpd_x86-2021-01-12/2021-01-11-raspios-buster-i386.iso
dd if=2021-01-11-raspios-buster-i386.iso of=/dev/sdc bs=10M

ReSpeaker 2-Mics Pi HAT

ReSpeaker 2-Mics Pi HAT是专为AI和语音应用设计的Raspberry Pi双麦克风扩展板。 这意味着您可以构建一个集成Amazona语音服务等的功能更强大,更灵活的语音产品。

该板是基于WM8960开发的低功耗立体声编解码器。 电路板两侧有两个麦克风采集声音,还提供3个APA102 RGB LED,1个用户按钮和2个板载Grove接口,用于扩展应用程序。 此外,3.5mm音频插孔或JST 2.0扬声器输出均可用于音频输出。

硬件概述

产品特征

配置

$ sudo raspi-config

打开 I2C

  • 3 Interface Options Configure connections to peripherals
  • P5 I2C Enable/disable automatic loading of I2C kernel module
  • Yes

IoT 硬件:NeoPixel

WS2812B 灯带 一个集控制电路与发光电路于一体的智能外控LED光源。可单独寻址数字 LED 灯。 每个像素都有自己的颜色和亮度。 您可以单独控制它们,并将其设置成任何颜色。 256 灰色级别可调节和 16777216 彩色 24 位全彩显示。

硬件清单

  • NodeMCU ESP32
  • WS2812B 灯带
  • 面包板
  • 3条杜邦线
  • USB数据线

电路图

ESP32 管脚图

开发 import time from machine import Pin from neopixel import NeoPixel from random import randint #GPIO0 pin = 0 #这里用的NeoPixel有60个灯珠 pixel_count = 60 np = NeoPixel(Pin(pin, Pin.OUT), pixel_count) def get_random_rgb_color(): red = randint(0, 255) green = randint(0, 255) blue = randint(0, 255) return (red, green, blue) def random_color(np): for _ in range(0, 10): for pixel_id in range(0, np.

命令brew

安装

brew install putty

FAQ

1、Updating Homebrew... 卡住

$ brew install putty
Updating Homebrew...
  • 方法1:直接关闭brew每次执行命令时的自动更新
$ vim ~/.bash_profile
export HOMEBREW_NO_AUTO_UPDATE=true
$ source ~/.bash_profile
  • 方法2:替换brew源
cd "$(brew --repo)"
git remote set-url origin https://mirrors.tuna.tsinghua.edu.cn/git/brew.git
cd "$(brew --repo)/Library/Taps/homebrew/homebrew-core"
git remote set-url origin https://mirrors.tuna.tsinghua.edu.cn/git/homebrew-core.git
brew update

2、`initialize': Version value must be a string; got a NilClass () (TypeError) $ brew install putty /usr/local/Homebr

VS Code远程开发 - SSH

架构图

安装

Remote

Local

连接远程主机

  1. 在VS Code中, 按F1,选择Remote-SSH: Connect to Host...输入user@hostname。
  1. VS Code将连接到SSH服务器并进行设置。 VS Code将使用进度通知使您保持最新状态。

  1. 连接后,您将进入一个空窗口。 您始终可以参考状态栏来查看连接到的主机。

  1. 选择菜单:File > Open...

关闭远程连接

  • 选择菜单:File > Close Remote Connection。
  • 您可以简单地退出VS Code,也可以关闭远程连接。

Remote Explorer

管理您的远程连接

在远程主机上打开终端

选择菜单:Terminal > New Terminal

在远程主机调试

在Extensions窗口中选择要在远程主机上安装的调试器,按F5。

FAQ "Visual Studio Code is unable to watch for file changes in this large workspace" (error

VS Code实践

编辑

  • 注释或取消注释 Command+/
  • 格式化文档 Option+Shift+f

选择

  • 多列选择 Option+Shift,按住鼠标左键拖动
  • 多选 Option,按住鼠标左键拖动

转到

  • 转到行号 Ctrl+g
  • 转到文件 Command+p

导航

  • 后退 Ctrl+-
  • 前进 Shift+Ctrl+-

视图

  • 自动换行 Option+z

窗口

  • 显示或隐藏Side Bar Command+b
  • 显示或隐藏Terminal Ctrl+`
  • 多个VS Code实例切换 Command+`
  • 一个VS Code实例中多个窗口切换 Ctrl+Tab

场景

当有一堆图片文件使用键盘进行快速浏览

  1. 按 Command+Shift+e 打开资源管理器。
  2. 使用键盘的上下箭头键选择要浏览的文件。
  3. 按 Space(filesExplorer.openFilePreserveFocus) 打开文件保留焦点。

参考资料

Python实践

语言

变量

  • 变量的赋值,只是表示让变量指向了某个对象,并不表示拷贝对象给变量;而一个对象,可以被多个变量所指向。
  • 可变对象(列表,字典,集合等等)的改变,会影响所有指向该对象的变量。
  • 对于不可变对象(字符串、整型、元组等等),所有指向该对象的变量的值总是一样的,也不会改变。但是通过某些操作(+= 等等)更新不可变对象的值时,会返回一个新的对象。
  • 变量可以被删除,但是对象无法被删除。

函数参数传递

Python 里所有的数据类型都是对象,所以参数传递时,只是让新变量与原变量指向相同的对象而已,并不存在值传递或是引用传递一说。

  • 不可变参数
>>> def func(x):
...     x=2
... 
>>> n=1
>>> func(n)
>>> n
1
  • 可变参数
>>> def func(x):
...     x.append(2)
... 
>>> l=[1]
>>> func(l)
>>> l
[1, 2]
  • 最佳实践(不管参数是可变还是不可变,明确地返回值。)
>>> def func(x):
...     pass
...     return x
... 
>>> n=1
>>> n = func(n)
>>> n
1