编译寒武纪MLU220的嵌入式操作系统

OpenIL 是一个基于 Buildroot 的开源项目,专为嵌入式工业解决方案而设计。

Buildroot 是一个简单、高效、易用的工具,通过交叉编译生成嵌入式 Linux 系统。

获取 OpenIL

git clone https://github.com/openil/openil.git
cd openil/

切换版本

查看版本

$ git tag
OpenIL-201705
OpenIL-201708
OpenIL-201712
OpenIL-201803
OpenIL-201805
OpenIL-201808
OpenIL-201810
OpenIL-201901
OpenIL-201904
OpenIL-201908
OpenIL-v1.10-202012
OpenIL-v1.10-202012-EAR
OpenIL-v1.11-202104
OpenIL-v1.11-RC2
OpenIL-v1.6.1-201909
OpenIL-v1.6.2-201911
OpenIL-v1.7-202001
OpenIL-v1.7-202001-update
OpenIL-v1.8-202005
OpenIL-v1.8.1-202009
OpenIL-v1.8.2-202009
OpenIL-v1.9-202009

切换版本

git branch OpenIL-v1.8-202005

Linux下查看img文件内容

img 磁盘镜像文件

查看分区表信息 $ fdisk sdcard.img Welcome to fdisk (util-linux 2.34). Changes will remain in memory only, until you decide to write them. Be careful before using the write command. Command (m for help): p Disk sdcard.img: 2.19 GiB, 2348810240 bytes, 4587520 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: dos Disk identifier: 0x00000000 Device Boot Start End Sectors Size Id Type sdcard.img1 * 131072 393215 262144 128M c W95 FAT32 (LBA) sdcard.

Kubernetes中配置调度器

我们遇到一个场景,压榨出每一台节点的性能,需要优先调度到资源(CPU、Memory)使用最多的节点上。

了解默认调度

现有的通用调度程序是平台默认提供的调度程序引擎,它可通过三步操作来选择托管 pod 的节点:

过滤节点

根据指定的约束或要求过滤可用的节点。这可以通过名为predicates的过滤函数列表筛选每个节点来完成。

排列过滤后节点列表的优先顺序

实现方式是让每个节点通过一系列优先级函数,以为其分配从 0 到 10 的一个分数。0 代表不适合的节点,10 则代表最适合托管该 pod。调度程序配置还可以为每个优先级函数使用简单的权重(正数值)。每个优先级函数提供的节点分数乘以权重(大多数优先级的默认权重为 1),然后将每个节点从所有优先级获得的分数相加。管理员可以使用这个权重属性,为一些优先级赋予更高的重要性。

选择最适合的节点

节点按照分数排序,系统选择分数最高的节点来托管该 pod。如果多个节点的分数相同,则随机选择其中一个。

配置调度策略 编写调度策略文件,配置优先级。 配置参与打分项及权重。这里使用了 MostRequestedPriority,优先使用占用 CPU 和 Memory 多的节点。 sudo vim /etc/kubernetes/scheduler-policy-config.

命令lftp

安装 lftp

sudo apt-get -y install lftp

登录 FTP

lftp [-d] [-e cmd] [-p port] [-u user[,pass]] [site]

lftp -p 8821 -u sdlrzn download.cambricon.com

执行内部命令

查看 FTP 服务器目录内容

ls

下载文件

get /product/GJD/MLU270/1.7.604/Ubuntu18.04/Driver/neuware-mlu270-driver-dkms_4.9.8_all.deb

下载目录

mirror remote local

mirror MLU270 MLU270

执行本地系统命令

local pwd
local ls
local rm -r MLU270

参考资料

远程执行Shell命令

安装 Fabric

pip3 install fabric

远程执行 Shell 命令脚本(remote_execute_shell_command.py) #!/usr/bin/python import argparse from fabric import Connection, Config # 您要远程操作的计算机,username@ip HOSTS = ['root@192.168.0.1', 'root@192.168.0.2'] PASSWORDS = ['admin', 'admin'] if name == 'main': parser = argparse.ArgumentParser() parser.add_argument('-c', '--command', type=str, help='execute shell command.') args = parser.parse_args() if not args.command: args.command = 'uname -a' print('➜ Execute shell command: ', args.

安装Kubernetes Dashboard

用户界面 Dashboard

Dashboard 是基于网页的 Kubernetes 用户界面。您可以使用 Dashboard 将容器应用部署到 Kubernetes 集群中,也可以对容器应用排错,还能管理集群资源。您可以使用 Dashboard 获取运行在集群中的应用的概览信息,也可以创建或者修改 Kubernetes 资源(如 Deployment,Job,DaemonSet 等等)。例如,您可以对 Deployment 实现弹性伸缩、发起滚动升级、重启 Pod 或者使用向导创建新的应用。

部署 Dashboard

安装 Dashboard

kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.4.0/aio/deploy/recommended.yaml

过几分钟后您将看到 kubernetes-dashboard 名字空间下会有 Pod 运行。

安装Kubernetes 1.21.5

删除 Kubernetes 旧版本,安装 Kubernetes 1.21.5。

必备安装

每台服务器都需要

root 登录

su - root

设置时区

timedatectl set-timezone Asia/Shanghai

设置主机名

hostnamectl set-hostname new-hostname

安装 Docker-CE

apt-get -y update
apt-get -y install apt-transport-https ca-certificates curl software-properties-common

# 安装GPG证书
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | apt-key add -

# 写入软件源信息
add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"

# 更新并安装
apt-get -y update
apt-get -y install docker-ce docker-ce-cli containerd.io

使用PaddleOCR进行文字识别

安装

pip install paddleocr

测试

import cv2
import numpy as np

from paddleocr import PaddleOCR


ocr = PaddleOCR(use_angle_cls=True)
image_path = 'test.jpg'
img = cv2.imread(image_path)

img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
img_gray1 = img_gray[:,:, np.newaxis]
img_gray3 = np.concatenate([img_gray1, img_gray1, img_gray1], axis=-1)

texts = ocr.ocr(img_gray3)
for text in texts:
    """
    box   坐标1         坐标2
          坐标4         坐标3
    """
    box = text[0]
    t = text[1][0]
    score = text[1][1]

可视化(图像上画出文本和得分) import os import shutil import cv2 import numpy as np import uuid from PIL import ImageFo

在 Python 中解析和修改 XML

XML 数据

xml_data = '''<?xml version="1.0" encoding="UTF-8"?>
<books>
    <book SN="12460901">
        <name>国富论</name>
        <author nation="English">亚当·斯密</author>
        <price>108</price>
        <ISBN>9787511373229</ISBN>
    </book>
    <book SN="12257413">
        <name>原则</name>
        <author nation="America">瑞·达利欧</author>
        <price>98</price>
        <ISBN>9787508684031</ISBN>
    </book>
</books>
'''

xml.etree.ElementTree 导入 import xml.

OpenCV Python实践

安装

Python

sudo apt install python3
sudo apt install python3-pip
sudo pip3 install --upgrade pip

OpenCV

sudo pip3 install opencv-python
sudo pip3 install opencv-contrib-python

图像

读取图像

import cv2

img_file = 'python-logo@2x.png'
img = cv2.imread(img_file)

获取图像大小

width = img.shape[1]
height = img.shape[0]

显示图像并等待按任意键退出

import cv2

img_file = 'python-logo@2x.png'
img = cv2.imread(img_file)
cv2.imshow('', img)
cv2.waitKey(0)

宽高缩小一倍 比例 import cv2 img_file = 'python-logo@2x.png' img = cv2.imread(img_file) img = cv2.resize(img, None, fx=0.5, fy=0.5) cv2.

使用 Python 临时文件模块

file.write() 内容超过 4K 才会写入磁盘

验证代码

import os
import tempfile

for count in range(1, 4100):
    content = '0'*count
    with tempfile.NamedTemporaryFile() as file:
        print(file.name)
        file.write(content.encode())

        with open(file.name, 'r') as tf:
            content_len = len(tf.read())
            if content_len > 0:
                print(f'{count} bytes written successfully.')

运行结果 /var/folders/bc/7lz308t90gb1h1xw6k4j65x80000gn/T/tmpj458ozas /var/folders/bc/7lz308t90gb1h1xw6k4j65x80000gn/T/tmpmrxo8sg1 /var/folders/bc/7lz308t90gb1h1xw6k4j65x80000gn/T/tmp0hu_i4hz 4097 bytes written successfully.

Kubernetes中的计算资源管理

查看节点资源总量

$ kubectl describe nodes ln1

Name:               ln1
...
Capacity:
  cpu:                40
  ephemeral-storage:  574345384Ki
  hugepages-1Gi:      0
  hugepages-2Mi:      0
  memory:             264015508Ki
  pods:               110
Allocatable:
  cpu:                40
  ephemeral-storage:  529316705019
  hugepages-1Gi:      0
  hugepages-2Mi:      0
  memory:             263913108Ki
  pods:               110
  • Capacity, 节点的资源总量
  • Allocatable, 可分配给 Pod 的资源量

Pod 中的容器申请资源 定义 Pod,通过容器指定 CPU 和内存的资源请求量 #requests-pod.

Docker 网络

ifconfig & route

$ docker run -d --name centos1 centos
$ docker run -it --name centos2 centos bash
# yum install net-tools -y

# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.3  netmask 255.255.0.0  broadcast 172.17.255.255
        ether 02:42:ac:11:00:03  txqueuelen 0  (Ethernet)
        RX packets 3475  bytes 14166022 (13.5 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 2988  bytes 214839 (209.8 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

# route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         _gateway        0.0.0.0         UG    0      0        0 eth0
172.17.0.0      0.0.0.0         255.255.0.0     U     0      0        0 eth0

iptables

规则

添加规则

iptables -t raw -A OUTPUT -p icmp -j TRACE
iptables -t raw -A PREROUTING -p icmp -j TRACE

查看规则

# iptables -t raw -L -n --line-numbers 
Chain PREROUTING (policy ACCEPT)
num  target     prot opt source               destination         
1    TRACE      icmp --  0.0.0.0/0            0.0.0.0/0           

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination         
1    TRACE      icmp --  0.0.0.0/0            0.0.0.0/0           

删除规则

iptables -t raw -D PREROUTING 1
iptables -t raw -D OUTPUT 1

参考资料

Docker SDK for Python Examples

安装 Docker SDK for Python

pip install docker

例子

将本地文件或目录添加到容器,生成新的镜像。

  • put_archive
  • commit
import docker
import tarfile
import tempfile
import os

def simple_tar(path):
    f = tempfile.NamedTemporaryFile()
    t = tarfile.open(mode='w', fileobj=f)
    abs_path = os.path.abspath(path)
    t.add(abs_path, arcname=os.path.basename(path))
    t.close()
    f.seek(0)
    return f

client = docker.from_env()
// ...

参考资料

如何使用 Docker 打包已注册的模型

模型打包成镜像

手工打包

project_dir=platen-switch
darknet_model_name=darknet-model-platen-switch

cd $project_dir
docker run -d --name $darknet_model_name alpine
docker cp model/ $darknet_model_name:/
docker commit -a 'wang-junjian@qq.com' -m 'darknet model [platen-switch recognition]' \
  $darknet_model_name gouchicao/$darknet_model_name:latest
docker rm -v $darknet_model_name

docker push gouchicao/$darknet_model_name:latest

Python 脚本 import docker import tarfile import tempfile import os def simple_tar(path): f = tempfile.NamedTemporaryFile() t = tarfile.

Kubernetes JSONPath实践

Node

标签信息

查看单个节点

$ kubectl get node ln1 -o=jsonpath='{.metadata.labels}{"\n"}'
map[beta.kubernetes.io/arch:amd64 beta.kubernetes.io/os:linux kubernetes.io/arch:amd64 kubernetes.io/hostname:ln1 kubernetes.io/os:linux node-role.kubernetes.io/master:]

查看集群所有节点 $ kubectl get nodes -o=jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.metadata.labels}{"\n"}{end}' gpu1 map[beta.kubernetes.io/arch:amd64 beta.kubernetes.io/os:linux k8s.amazonaws.com/accelerator:vgpu kubernetes.io/arch:amd64 kubernetes.io/hostname:gpu1 kubernetes.

minikube

安装

安装 kubectl

curl -LO "https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl"
chmod +x ./kubectl
mv ./kubectl /usr/local/bin/kubectl

安装 minikube

curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
install minikube-linux-amd64 /usr/local/bin/minikube

启动 Kubernetes 集群 # minikube start --force 😄 Centos 8.1.1911 (amd64) 上的 minikube v1.22.

在Kubernetes上安装Ingress

官方的安装

helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update

helm install ingress-nginx ingress-nginx/ingress-nginx

在中国

  1. 下载 [Ingress Release][ingress-nginx-releases]
wget https://github.com/kubernetes/ingress-nginx/releases/download/ingress-nginx-3.3.0/ingress-nginx-3.3.0.tgz
  1. 解压
tar xzvf ingress-nginx-3.3.0.tgz
cd ingress-nginx

替换镜像 vim values.yaml repository: k8s.gcr.