运行时环境层
展示了如何使用Sophon的sail库获取硬件设备的多种信息,包括TPU数量、利用率、温度、设备状态以及如何操作张量和进行数据编码。
- sophon.sail: 这是一个用于与Sophon硬件设备交互的库。通过该库,可以获取设备的状态、资源利用率和温度等信息。
- sail.get_available_tpu_num():获取当前可用的TPU数量,并将其存储在tpu_len变量中。
- dev_id设置为0,表示选择第一个设备。sail.get_vpp_util(dev_id):获取该设备的VPP(视频处理单元)利用率,并打印出来。
- sail.get_board_temp(dev_id):获取板卡的温度并打印。sail.get_chip_temp(dev_id):获取芯片的温度并打印。
- sail.get_dev_stat(dev_id):获取设备的状态信息并打印。
- sail.Handle(tpu_id):创建一个TPU句柄,用于后续的设备操作。handle.get_device_id():获取设备的ID。handle.get_sn():获取设备的序列号。handle.get_target():获取设备的目标信息。
- sail.Tensor(handle, input_data):将NumPy数组转换为Sophon张量。input_tensor1.shape():获取并打印张量的形状。arr.tobytes():将NumPy数组转换为字节格式。sail.base64_encode(handle, arr_bytes):将字节数据进行Base64编码。输出编码后的结果。
- sail.get_tpu_util(dev_id):获取指定设备的TPU利用率并打印。
import sophon.sail as sail
import numpy as np
if __name__ == '__main__':
# Get the number of available TPUs
tpu_len = sail.get_available_tpu_num()
print('Available TPU:', tpu_len)
# Get VPP utilization
dev_id = 0
print("VPP Utilization:", sail.get_vpp_util(dev_id))
# Get board temperature
print("Board Temperature:", sail.get_board_temp(dev_id))
# Get chip temperature
print("Chip Temperature:", sail.get_chip_temp(dev_id))
# Get device status
print("Device Status:", sail.get_dev_stat(dev_id))
# Create a Handle for TPU with ID 0
tpu_id = 0
handle = sail.Handle(tpu_id)
print("Device ID:", handle.get_device_id())
print("Serial Number:", handle.get_sn())
print("Target:", handle.get_target())
# Create a Tensor from a NumPy array
input_data = np.array([1, 2, 3])
input_tensor1 = sail.Tensor(handle, input_data)
print("Input Tensor Shape:", input_tensor1.shape())
# Convert a NumPy array to bytes and encode it
arr = np.array([[1, 2, 3], [4, 5, 6]])
arr_bytes = arr.tobytes()
base64_encoded_arr = sail.base64_encode(handle, arr_bytes)
print("Base64 Encoded Array:", base64_encoded_arr)
# Get TPU utilization
print("Device {} TPU Utilization is {} %".format(dev_id, sail.get_tpu_util(dev_id)))
结果
Available TPU: 1
VPP Utilization: [0, 0]
Board Temperature: 31
Chip Temperature: 37
Device Status: [14679, 0, 0]
Device ID: 0
Serial Number:
Target: BM1684X
Input Tensor Shape: [3]
Base64 Encoded Array: b'AQAAAAAAAAACAAAAAAAAAAMAAAAAAAAABAAAAAAAAAAFAAAAAAAAAAYAAAAAAAAA'
Device 0 TPU Utilization is 0 %
下面的代码结合了设备信息获取、处理器利用率、温度读取以及张量初始化等功能:
- 设备信息获取:使用 sail:Handle 对象获取设备 ID、序列号(SN)和目标信息。
- TPU 和 VPU 利用率:通过 sail:get_tpu_util 和 sail:get_vpu_util 函数分别获取 TPU 和 VPU 的使用率。
- 板和芯片温度:使用 sail:get_board_temp 和 sail:get_chip_temp 获取设备板和芯片的温度信息。
- 设备内存统计:调用 sail:get_dev_stat 获取设备的内存总量、已用内存以及 TPU 使用率。
- 张量初始化:通过 sail:Tensor 初始化两个张量对象,其中一个通过设备句柄进行初始化。
#include <stdio.h>
#include <sail/cvwrapper.h>
#include <iostream>
#include "tensor.h"
using namespace std;
int main() {
// Device initialization
int tpu_id = 0;
sail::Handle handle(tpu_id);
// Print basic device information
std::cout << "Device ID: " << handle.get_device_id() << std::endl;
std::cout << "SN: " << handle.get_sn() << std::endl;
std::cout << "Target: " << handle.get_target() << std::endl;
// Get TPU utilization
int tpu_util = sail::get_tpu_util(0);
std::cout << "TPU Utilization: " << tpu_util << "%" << std::endl;
// Get VPU utilization
std::vector<int> vpu_util = sail::get_vpu_util(0);
for(int i = 0; i < vpu_util.size(); i++) {
std::cout << "VPU ID: " << i << ", Utilization: " << vpu_util[i] << "%" << std::endl;
}
// Get board temperature
int board_temp = sail::get_board_temp(0);
std::cout << "Board Temperature: " << board_temp << "℃" << std::endl;
// Get chip temperature
int chip_temp = sail::get_chip_temp(0);
std::cout << "Chip Temperature: " << chip_temp << "℃" << std::endl;
// Get device memory statistics
std::vector<int> dev_stat = sail::get_dev_stat(0);
std::cout << "Memory Total: " << dev_stat[0] << " MB" << std::endl;
std::cout << "Memory Used: " << dev_stat[1] << " MB" << std::endl;
std::cout << "TPU Utilization: " << dev_stat[2] << " %" << std::endl;
// Tensor initialization
int dev_id = 0;
sail::Handle tensor_handle(dev_id);
std::shared_ptr<sail::Tensor> input_tensor1, input_tensor2;
std::vector<int> input_shape = {10, 10};
bm_data_type_t input_dtype = BM_FLOAT32; // dtype can be BM_FLOAT32, BM_INT8, etc.
// Initialize tensors
input_tensor1 = std::make_shared<sail::Tensor>(input_shape, input_dtype);
input_tensor2 = std::make_shared<sail::Tensor>(tensor_handle, input_shape, input_dtype, true, true);
return 0;
}