简介
官方文档。Hiddify app 是一款基于 Sing-box 通用代理工具的跨平台代理客户端。Hiddify 提供了较全面的代理功能,例如自动选择节点、TUN 模式、使用远程配置文件等。Hiddify 无广告,并且代码开源。它为大家自由访问互联网提供了一个支持多种协议的、安全且私密的工具。
官网。
Arrow C++ 库由多个部分组成,每个部分完成不同的功能。
Memory management 抽象提供了统一的 API 来管理内存
Buffer 抽象表示物理数据的连续区域。
读写尽可能多的文件格式,比如 Parquet、CSV、Orc,以及 Arrow 专用的 Feather 格式。
文件系统抽象允许从不同的存储后端读取和写入数据,例如本地文件系统或 S3 存储桶
Acero 是一个流查询引擎,用来制定和执行计算。
Arrow 使用 ExecPlan 来表示计算,ExecPlan 以零个或多个 Stream 作为输入,但输出只有一个 Stream。Plan 描述了数据怎么被转换、传递。
ExecNode 是 Acero 中最基础的概念,ExecNode 有零个或多个输入,零或一个输出。如果没有 Source,称其为源;如果没有输出,称其为 Sink。ExecNode 还有多种类型。
批量数据(Batches of Data)使用 ExecBatch 类来描述。ExecBatch 是一个二维结构,和 RecordBatch 很相似。可以有零个或多个列,每个列必须有相同的长度。
1 | exec_batch.length : 数据行度 (row) |
RecordBatch 和 ExecBatch 对 Arrays 和 Buffers 都有强所有权。把 RecordBatch 转换为 ExecBatch 总是零拷贝的。但是 ExecBatch 转换为 RecordBatch 时只有在无标量(Scalar) 时才是零拷贝。
ExecPlan 表示由 ExecNode 组成的图。一个合法的 ExecPlan 必须由一个 Source 节点,但技术上不需要有 Sink 节点。ExecPlan 包含所有节点共享的资源,以及工具方法来启动、停止节点的执行。ExecPlan 和 ExecNode 都与单个执行的生命周期相关联。它们有状态,预计不可重新启动。
Declaration 是 ExecNode 的蓝图。声明可以组合成一个图表,形成 ExecPlan 的蓝图。
Acero 的基础工作流如下。
Substrait 是创建 Plan (Graph of Declaration)的推荐机制,原因如下。
以编程方式创建执行计划比从 Substra 创建计划更简单。Declaration::Sequence()
可以更方便地创建处理序列。
arrow::Table
arrow::RecordBatchReader
ExecPlan::Validate
EexcPlan::StartProducing
ExecPlan::finished
用作数据源。
对数据进行计算、转换、重塑。
重新排序、组合或切片数据流。
Sink 节点会结束一个 Plan。通常不需要创建 Sink Node,会基于 DeclarationToXyz 方法选择。
PushGenerator
JoinType
KernelState
KernelContext
KernelInitArgs
ScalarKernel
1 | // Function 帮助类 |
所有神经网络模块的基类,自定义的模型也应把该类作为基类。
1 | forward(*input) : 定义每次调用时的计算逻辑,所有子类都应该重写 |
提供了一种简单的方式来按顺序堆叠神经网络的层,用于快速构建一个顺序的神经网络模型。在模型进行前向传播时,nn.Sequential
会按照层的顺序依次调用每个层的forward
方法,将前一层的输出作为下一层的输入,直到最后一层输出结果。
local_rank = torch.distributed.get_rank() % torch.cuda.device_count()
计算(在每个机器进程数一致时)FeatureComputeContext 和 FeatureComputeExecContext 都是在 cpp 文件中进行定义。
1 | EmbeddingBagModule -> torch.nn.Module |
1 | EmbeddingSumConcat -> EmbeddingOperator -> torch.nn.Module |
metaspore.so
MetaSpore C++ 包含几个模块。
globals
hashmap
arrow
features
1 | embedding_size : 每个特征组的 embedding size |
初始化内容。
1 | PyTorchEstimator |
1 | PyTorchAgent |
基于神经元模型,提出了感知机学习规则。感知机规则提出了一个可以自动学习的权重优化算法。
感知机算法步骤如下。
需要注意的是。
调用 CUDA 运行时 API 时,接口返回错误码。
1 | __host__ __device__ cudaError_t cudaGetDeviceCount ( int* count ); // 获取设备数量, 返回错误码 |
1 | __host__ __device__ const char* cudaGetErrorName ( cudaError_t error ); // 获取错误码的枚举名称 |
定义错误检查函数
1 | __host__ void error_check_entry() { |
核函数的返回值必须是 void。
1 | __host__ __device__ cudaError_t cudaGetLastError ( void ); // 返回最后一次错误码 |
1 | __global__ void kernel_error_entry() { |
1 | __host__ cudaError_t cudaEventCreate ( cudaEvent_t* event ); |
示例。
1 | cudaEvent_t start, end; |
error_check。
1 | __host__ __device__ cudaError_t error_check(cudaError_t err, const char *fn, int line) { |
nvprof 是评估 cuda 程序性能的工具。不过目前已经是过时的工具,不适用 compute capability >= 8.0 的设备。新设备适用 nsys 替代。
1 | nvprof {cuda-program} |
1 | nsys profile {cuda-program} # 运行并记录程序的 profile 到 nsys-rep 文件 |
运行时 API
1 | __host__ cudaError_t cudaGetDeviceProperties ( cudaDeviceProp* prop, int device ) |
1 | __host__ void PrintDeviceInfo() { |
1 | tree |
1 | helm install ace ace/nginx |
1 | helm upgrade ace ace/nginx |
1 | helm uninstall ace |
1 | helm upgrade --install {release-name} {chart-path} \ |
解释
--install
:更新 release,如果不存在则安装--create-namespace
:如果 namespace 不存在,则创建,和 --install
配合使用--set app.tag
:指定 Value app.tag
的值1 | top -Hp {pid} # 查看指定进程内各线程占用 CPU 的情况 |
查看线程数量
1 | ps -p {pid} -L | wc -l |
1 | pidstat -w -p {pid} |
其中,<PID>
是目标进程的进程 ID。上述命令将显示指定进程的 CPU 上下文切换统计信息,包括自愿切换(voluntary switches)和非自愿切换(non-voluntary switches)。
1 | Linux 4.14.301-224.520.amzn2.x86_64 (...) 2024年07月04日 _x86_64_ (32 CPU) |
1 | 安装 |
1 | perf stat -e cs,<event> -p <PID> |
perf stat 和 perf record 区别
perf stat
快速查看程序基本性能指标
采集 CPU 指令、缓存命中率、上下文切换等
perf record
可采集系统或特定进程的性能事件
采集指令、缓存、分支等事件
可导出文件,用于后续的分析
1 | yum install perf -y |