记某人工智能网络安全应用测试活动
Jun 17, 2026 · 7790 字
最近参加了某人工智能网络安全应用测试活动,活动提供了双卡 Ascend 910B,要求离线断网环境下完成安全系统的代码审计和渗透测试。思来想去打算使用 Qwen3.6 + Opencode 的方式来完成代码审计和渗透测试,下面是我的环境搭建过程。
配置环境
首先查看系统信息和 NPU 信息:
[root@hostname ~]# neofetch --off
root@hostname
-------------------------------
OS: openEuler 22.03 (LTS-SP4) aarch64
Host: KVM Virtual Machine virt-6.2
Kernel: 5.10.0-268.0.0.171.oe2203sp4.aarch64
Uptime: 3 days, 20 hours, 12 mins
Packages: 777 (rpm)
Shell: bash 5.1.8
Resolution: 1024x768
Terminal: /dev/pts/0
CPU: (44) @ 2.400GHz
GPU: 02:05.0 Virtio: Virtio GPU
Memory: 1500MiB / 385480MiB
[root@hostname ~]# npu-smi info
+------------------------------------------------------------------------------------------------+
| npu-smi 25.5.1 Version: 25.5.1 |
+---------------------------+---------------+----------------------------------------------------+
| NPU Name | Health | Power(W) Temp(C) Hugepages-Usage(page) |
| Chip | Bus-Id | AICore(%) Memory-Usage(MB) HBM-Usage(MB) |
+===========================+===============+====================================================+
| 4 | 910B2 | OK | 88.4 42 0 / 0 |
| 0 | 0000:07:00.0 | 0 | 0 | 3202 / 65536 |
+===========================+===============+====================================================+
| 5 | 910B2 | OK | 86.2 41 0 / 0 |
| 0 | 0000:08:00.0 | 0 | 0 | 3203 / 65536 |
+===========================+===============+====================================================+
+---------------------------+---------------+----------------------------------------------------+
| NPU Chip | Process id | Process name | Process memory(MB) |
+===========================+===============+====================================================+
| No running processes found in NPU 4 |
+===========================+===============+====================================================+
| No running processes found in NPU 5 |
+===========================+===============+====================================================+
可以看到两张 Ascend 910B 卡都正常工作,接下来初始化数据盘:
[root@hostname ~]# fdisk -l
Disk /dev/vda: 445 GiB, 477815111680 bytes, 933232640 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 5C41065C-1B0B-4D88-A1B0-099219C70712
Device Start End Sectors Size Type
/dev/vda1 2048 411647 409600 200M EFI System
/dev/vda2 411648 2508799 2097152 1G Linux filesystem
/dev/vda3 2508800 2512895 4096 2M BIOS boot
/dev/vda4 2512896 933230591 930717696 443.8G Linux LVM
Disk /dev/vdb: 512 GiB, 549755813888 bytes, 1073741824 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk /dev/mapper/vg_sys-lv_root: 355.04 GiB, 381216096256 bytes, 744562688 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
[root@hostname ~]# mkfs.ext4 /dev/vdb
mke2fs 1.46.4 (18-Aug-2021)
Discarding device blocks: done
Creating filesystem with 134217728 4k blocks and 33554432 inodes
Filesystem UUID: c374cecb-28bc-4be5-82b7-1576a028f299
Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968, 102400000
Allocating group tables: done
Writing inode tables: done
Creating journal (262144 blocks): done
Writing superblocks and filesystem accounting information: done
[root@hostname ~]# mkdir /data
[root@hostname ~]# mount /dev/vdb /data
[root@hostname ~]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 4.0M 0 4.0M 0% /dev
tmpfs 189G 0 189G 0% /dev/shm
tmpfs 76G 1.3M 76G 1% /run
tmpfs 4.0M 0 4.0M 0% /sys/fs/cgroup
/dev/mapper/vg_sys-lv_root 355G 7.9G 347G 3% /
tmpfs 189G 0 189G 0% /tmp
/dev/vda2 1014M 160M 855M 16% /boot
/dev/vda1 200M 6.5M 194M 4% /boot/efi
tmpfs 38G 0 38G 0% /run/user/0
/dev/vdb 503G 28K 478G 1% /data
完成之后就可以准备下载模型了,这里我们直接使用 Qwen3.6-35B-A3B 的基础模型版本:
pip install modelscope
modelscope download --model Qwen/Qwen3.6-35B-A3B --local-dir /data/models/Qwen3.6-35B-A3B
最后启动 vllm-ascend 插件版本,这里我已经配置好优化参数了。
docker run -d \
--name vllm-ascend \
--net=host \
--shm-size=64g \
--device /dev/davinci4 \
--device /dev/davinci5 \
--device /dev/davinci_manager \
--device /dev/devmm_svm \
--device /dev/hisi_hdc \
-v /usr/local/dcmi:/usr/local/dcmi \
-v /usr/local/Ascend/driver/tools/hccn_tool:/usr/local/Ascend/driver/tools/hccn_tool \
-v /usr/local/bin/npu-smi:/usr/local/bin/npu-smi \
-v /usr/local/Ascend/driver/lib64/:/usr/local/Ascend/driver/lib64/ \
-v /usr/local/Ascend/driver/version.info:/usr/local/Ascend/driver/version.info \
-v /etc/ascend_install.info:/etc/ascend_install.info \
-v /data:/data \
quay.io/ascend/vllm-ascend:v0.21.0rc1-openeuler \
vllm serve /data/models/Qwen3.6-35B-A3B \
--served-model-name Qwen3.6-35B-A3B \
--tensor-parallel-size 2 \
--trust-remote-code \
--max-model-len 65536 \
--reasoning-parser qwen3 \
--enable-auto-tool-choice \
--tool-call-parser qwen3_coder \
--speculative-config '{"method":"qwen3_next_mtp","num_speculative_tokens":2}'
其中:
--shm-size=64g是指定共享内存大小,避免模型加载时出现内存不足的问题--tensor-parallel-size 2是指定张量并行的大小--max-model-len 65536是指定模型的上下文长度--reasoning-parser qwen3是指定推理解析器--enable-auto-tool-choice是启用自动工具选择--tool-call-parser qwen3_coder是指定工具调用解析器--speculative-config '{"method":"qwen3_next_mtp","num_speculative_tokens":2}'用于开启 MTP 推理模式,提升推理速度
启动后可以通过以下命令查看日志和进入容器进行交互:
# 查看日志
docker logs -f vllm-ascend
# 打开 vllm chat 交互
docker exec -it vllm-ascend vllm chat
配置 Agent
首先安装 nvm 和 Node.js,我们使用 Node.js 24 LTS 版本。
# 下载并安装 nvm:
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash
# 代替重启 shell
\. "$HOME/.nvm/nvm.sh"
# 下载并安装 Node.js:
nvm install 24
# 验证 Node.js 版本:
node -v # Should print "v24.17.0".
# 验证 npm 版本:
npm -v # Should print "11.13.0".
Codex
目前 vLLM 对 responses 的支持还是实验性功能,这里只是 Codex 的样例,最后我们选择的是下面的 Opencode 来完成 Agent 的配置。
npm install -g @openai/codex
cat > ~/.codex/config.toml <<EOL
model_provider = "custom"
model = "Qwen3.6-35B-A3B"
[model_providers.custom]
name = "custom"
wire_api = "responses"
base_url = "http://localhost:8000/v1"
[model_metadata.Qwen3.6-35B-A3B]
context_window = 65536
max_output_tokens = 16384
supports_streaming = true
supports_tool_calls = true
EOL
Opencode
npm i -g opencode-ai
cd /data/workspace
cat > opencode.json <<EOL
{
"$schema": "https://opencode.ai/config.json",
"provider": {
"local": {
"npm": "@ai-sdk/openai-compatible",
"options": {
"baseURL": "http://localhost:8000/v1"
},
"models": {
"Qwen3.6-35B-A3B": {}
}
}
}
}
EOL
下一步就可以爽爽安装各种 Skills、MCP 和插件了。
git clone https://gitcode.com/gh_mirrors/cv/cve-bin-tool.git
还有个 opencode-goal,在 opencode.json 中添加以下内容:
{
"plugin": ["opencode-plugin-goal"]
}