运行时环境层

展示了如何使用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; }