File size: 4,578 Bytes
4b26793
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
# onnxruntime-node 安装问题修复方案

## 问题描述

`onnxruntime-node@1.23.2` 的 postinstall 脚本在下载二进制文件时无法正确处理 HTTP 302 重定向,导致安装失败:

```
Error: Failed to download build list. HTTP status code = 302
```

## 根本原因

Node.js 原生的 `https.get()` 不会自动跟随 HTTP 重定向。`onnxruntime-node``install-utils.js` 中的 `downloadFile()``downloadJson()` 函数缺少重定向处理逻辑。

## 解决方案

### 方案 A: 应用 Patch(推荐)

已创建 patch 文件来修复重定向问题:

```bash
cd ~/work/trigoRL/third_party/trigo/trigo-web/node_modules/onnxruntime-node/script
patch -p0 < ~/work/trigoRL/third_party/trigo/trigo-web/onnxruntime-node-redirect-fix.patch
```

**Patch 修改内容:**
1.`downloadFile()``downloadJson()` 添加 `maxRedirects` 参数(默认值 5)
2. 检测 HTTP 状态码 300-399 并提取 `Location`3. 递归调用自身跟随重定向,直到获得 200 状态码或达到最大重定向次数

### 方案 B: 跳过安装(仅用于不需要 ONNX 推理的场景)

```bash
yarn install --ignore-scripts
```

**限制:** onnxruntime-node 的 CUDA 和 TensorRT 二进制文件不会被下载,无法在 Node.js 中进行 GPU 推理。

## 修复验证

### 1. 测试安装脚本

```bash
cd ~/work/trigoRL/third_party/trigo/trigo-web/node_modules/onnxruntime-node
node ./script/install
```

**预期输出:**
```
Following redirect to https://nuget.azure.cn/v3/index.json
Following redirect to https://nuget.azure.cn/v3-flatcontainer/...
Downloading https://api.nuget.org/v3-flatcontainer/...
Extracting runtimes/linux-x64/native/libonnxruntime_providers_cuda.so to ...
Extracting runtimes/linux-x64/native/libonnxruntime_providers_shared.so to ...
Extracting runtimes/linux-x64/native/libonnxruntime_providers_tensorrt.so to ...
```

### 2. 验证模块加载

```bash
cd ~/work/trigoRL/third_party/trigo/trigo-web
node -e "const ort = require('onnxruntime-node'); console.log('Supported backends:', ort.listSupportedBackends());"
```

**预期输出:**
```javascript
Supported backends: [
  { name: 'cpu', bundled: true },
  { name: 'webgpu', bundled: true },
  { name: 'cuda', bundled: false },
  { name: 'tensorrt', bundled: false }
]
```

### 3. 检查二进制文件

```bash
ls -lh ~/work/trigoRL/third_party/trigo/trigo-web/node_modules/onnxruntime-node/bin/napi-v6/linux/x64/*.so
```

**预期输出:**
```
-rw-rw-rw- 1 camus camus 352M libonnxruntime_providers_cuda.so
-rw-rw-rw- 1 camus camus  15K libonnxruntime_providers_shared.so
-rw-rw-rw- 1 camus camus 811K libonnxruntime_providers_tensorrt.so
```

## 技术细节

### 修改的函数

#### downloadFile()
添加递归重定向处理:
```javascript
async function downloadFile(url, dest, maxRedirects = 5) {
  // 检查重定向次数
  if (maxRedirects < 0) {
    reject(new Error('Too many redirects'));
    return;
  }

  // 检测 300-399 状态码
  if (res.statusCode >= 300 && res.statusCode < 400 && res.headers.location) {
    const redirectUrl = new URL(res.headers.location, url).toString();
    downloadFile(redirectUrl, dest, maxRedirects - 1).then(resolve).catch(reject);
    return;
  }
  // ...
}
```

#### downloadJson()
类似的重定向处理逻辑应用于 JSON 下载。

### 为什么需要这个修复

1. **NuGet CDN 重定向:** onnxruntime 使用 NuGet 包托管,某些 CDN 节点会返回 302 重定向
2. **代理环境:** 在使用代理的网络环境中,重定向更为常见
3. **地理位置优化:** NuGet 会根据地理位置重定向到最近的镜像服务器

## 未来维护`onnxruntime-node` 更新到新版本时:

1. **检查是否已修复:** 新版本可能已经包含重定向处理
2. **重新应用 patch:** 如果未修复,需要在新版本的 `install-utils.js` 上重新应用 patch
3. **提交上游 PR:** 可以向 onnxruntime 项目提交 Pull Request 来永久修复这个问题

## 相关文件

- **Patch 文件:** `onnxruntime-node-redirect-fix.patch`
- **原始脚本:** `node_modules/onnxruntime-node/script/install-utils.js`
- **备份文件:** `node_modules/onnxruntime-node/script/install-utils.js.backup`

## 环境信息

- **修复日期:** 2025-11-21
- **onnxruntime-node 版本:** 1.23.2
- **Node.js 版本:** v24.11.1
- **操作系统:** Ubuntu 22.04 (LXD container)
- **GPU:** 8x NVIDIA H20

## 状态**已彻底解决** - onnxruntime-node 的 CUDA 和 TensorRT 后端已成功安装并可用于 Node.js ONNX 模型推理。