WTS 橋接
.wts (Weights) 文件格式是一種純文本格式的權重存儲文件,主要作為 TensorRT 的中間格式使用。
功能
與 .pt 或 .onnx 等二進制格式不同,.wts 文件以人類可讀的文本格式存儲神經網絡權重參數。這特別適用於:
- 自定義層:當 ONNX 不支持特定層時,你可以手動提取權重並構建自定義 TensorRT 構建器。
- 調試:以人類可讀的格式檢查權重。
- 細粒度優化控制:控制權重轉換的每個方面。
文件結構
.wts 文件遵循簡單的格式:
<層數>
<層名稱_1> <權重數量_1> <權重值_1...>
<層名稱_2> <權重數量_2> <權重值_2...>
...
示例:
3
conv1.weight 324 0.123 -0.456 0.789 ...
conv1.bias 16 0.01 -0.02 0.03 ...
fc1.weight 10240 0.234 -0.567 0.890 ...
從 PyTorch 創建 WTS 文件
import torch
def generate_wts(pytorch_model, output_file):
named_parameters = pytorch_model.named_parameters()
num_layers = len(list(named_parameters))
with open(output_file, 'w') as f:
f.write(f"{num_layers}\n")
for name, param in pytorch_model.named_parameters():
param = param.cpu().detach().numpy().astype('float32')
flat_weights = param.flatten()
num_weights = len(flat_weights)
f.write(f"{name} {num_weights} ")
weights_str = " ".join([str(w) for w in flat_weights])
f.write(weights_str + "\n")
在 C++ 中解析 WTS 文件
#include <fstream>
#include <map>
#include <vector>
std::map<std::string, std::vector<float>> loadWeights(const std::string& file) {
std::map<std::string, std::vector<float>> weight_map;
std::ifstream input(file);
int num_layers;
input >> num_layers;
for (int i = 0; i < num_layers; ++i) {
std::string layer_name;
int num_weights;
input >> layer_name >> num_weights;
std::vector<float> weights(num_weights);
for (int j = 0; j < num_weights; ++j) {
input >> weights[j];
}
weight_map[layer_name] = weights;
}
return weight_map;
}
建議
雖然 .wts 提供了最大的透明度,但它應僅在標準的 .pt → .onnx → .engine 路徑失敗時作為備選方案使用。
優缺點
| 優點 | 缺點 |
|---|---|
| 透明度:易於調試和驗證權重值。 | 文件體積大:比二進制格式大 3-4 倍。 |
| 細粒度控制:非常適合自定義層轉換。 | 無架構信息:僅存儲權重,不存儲圖。 |
| 框架獨立:不受特定版本綁定。 | 精度損失:文本轉換期間會有微小誤差。 |