运行时环境层

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