| #!/usr/bin/env bash |
| |
| set -euo pipefail |
|
|
| SCRIPT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) |
| PROJECT_ROOT=$(cd "${SCRIPT_DIR}/.." && pwd) |
|
|
| ONNX_DIR="${PROJECT_ROOT}/compiled_subgraph_from_onnx/frontend" |
| OUTPUT_ROOT="${PROJECT_ROOT}/compiled_slice_quant_onnx" |
| LOG_ROOT="${OUTPUT_ROOT}/logs" |
| CONFIG_FILE="${PROJECT_ROOT}/pulsar2_configs/transformers.json" |
| TARGET_HW="AX650" |
| NPU_MODE="NPU3" |
| SKIP_FILES=("optimized.onnx" "optimized_quant_axmodel.onnx") |
|
|
| mkdir -p "${OUTPUT_ROOT}" "${LOG_ROOT}" |
|
|
| if [[ ! -d "${ONNX_DIR}" ]]; then |
| echo "未找到切分后的 ONNX 目录: ${ONNX_DIR}" >&2 |
| exit 1 |
| fi |
|
|
| mapfile -t ONNX_FILES < <(find "${ONNX_DIR}" -maxdepth 1 -type f -name '*.onnx' -printf '%f\n' | sort) |
|
|
| if [[ ${#ONNX_FILES[@]} -eq 0 ]]; then |
| echo "目录 ${ONNX_DIR} 中没有 ONNX 文件" >&2 |
| exit 1 |
| fi |
|
|
| echo "即将编译 ${#ONNX_FILES[@]} 个子模型" |
|
|
| for filename in "${ONNX_FILES[@]}"; do |
| skip=false |
| for banned in "${SKIP_FILES[@]}"; do |
| if [[ "${filename}" == "${banned}" ]]; then |
| skip=true |
| break |
| fi |
| done |
| if [[ "${skip}" == true ]]; then |
| echo "跳过 ${filename}" |
| continue |
| fi |
|
|
| stem="${filename%.onnx}" |
| input_path="${ONNX_DIR}/${filename}" |
| output_dir="${OUTPUT_ROOT}/${stem}" |
| output_name="${stem}.axmodel" |
| log_path="${LOG_ROOT}/${stem}.log" |
|
|
| mkdir -p "${output_dir}" |
|
|
| echo "[pulsar2] ${filename} -> ${output_name}" |
| if ! pulsar2 build \ |
| --input "${input_path}" \ |
| --model_type QuantAxModel \ |
| --output_dir "${output_dir}" \ |
| --output_name "${output_name}" \ |
| --config "${CONFIG_FILE}" \ |
| --target_hardware "${TARGET_HW}" \ |
| --npu_mode "${NPU_MODE}" \ |
| --debug.dump_frontend_graph true \ |
| 2>&1 | tee "${log_path}"; then |
| echo "编译 ${filename} 失败,日志已保存到 ${log_path}" >&2 |
| continue |
| fi |
|
|
| cp -f "${output_dir}/${output_name}" "${OUTPUT_ROOT}/" |
| echo "已复制 ${output_name} 到 ${OUTPUT_ROOT}" |
| done |
|
|
| echo "全部子模型编译完成。AXModel 文件已汇总至 ${OUTPUT_ROOT}" |