龙芯3B6000M运行Yolov8+FastApi
龙芯近日发布支持自研通用GPU的龙芯加速计算平台(Loongson Accelerated Computing Platform)首个软件版本,该平台基于龙芯2K3000(3B6000M) 及9A1000内集成的自研LG200系列通用GPU核心打造,实现了对算力芯片驱动、算力编程环境、AI模型推理等功能的全栈一体支持。兼容 OpenCL 3.0 规范、CUDA 5.0 计算能力规范及 CUDA API 10.0 规范,大幅降低国产算力生态门槛,并服务于工业视觉、智能安防等广泛领域。
请参考文档:https://docs.loongnix.cn/loongacm/
Yolov8是非常成熟和使用广泛的视觉检测模型,可用于目标检测、图像分类和实例分割等任务。手头有一款3B6000M龙芯派,本文抛砖引玉,基于龙芯3B6000M搭建了一个YoloV8+FastApi的Demo,可流畅运行,将搭建步骤分享一下:
1、硬件准备
CPU:2K3000或3B6000M( 7.2 TOPS @ INT8 )
内存空间:至少 8GB RAM
显存要求:大于等于 2GB
操作系统:Loongnix25.2
2、驱动安装
2.1 gpu驱动:
wget https://repos.loongson.cn/loonggpu/loongnix25/local_installers/loonggpu-repo-loongnix25-local_1.0.2-lnd25.1_loong64.deb sudo dpkg -i loonggpu-repo-loongnix25-local_1.0.2-lnd25.1_loong64.deb sudo apt-get update sudo apt-get -y install loonggpu-drive
安装后可以在终端验证一下,正常会出现如下结果:
$ lspci -s 00:06.0 -vvv 00:06.0 Multimedia video controller: Loongson Technology LLC Device 7a35 (rev 10) Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop+ ParErr- Stepping- SERR- FastB2B- DisINTx- Status: Cap- 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx- Latency: 0 Interrupt: pin A routed to IRQ 102 NUMA node: 0 Region 0: Memory at 408125e000 (64-bit, non-prefetchable) [size=256] Region 2: Memory at 4000000000 (64-bit, non-prefetchable) [size=2G] Region 4: Memory at 4081200000 (64-bit, non-prefetchable) [size=64K] Kernel driver in use: loonggpu $
2.2 算力栈软件安装
wget https://repos.loongson.cn/loongacm/loongnix25/local_installers/v0.1.0-lnd25.5/loongac-0.1.0-lnd25.5.tgz tar -xf loongac-0.1.0-lnd25.5.tgz cd loongac-0.1.0-lnd25.5 sudo apt install ./*.deb # 将当前用户加入 render 和 video 组中,其中 $LOGNAME 可以换成自己想要添加的用户名,配置后需重新注销登录生效。 sudo usermod -a -G render,video $LOGNAME
2.3 验证安装
/opt/lacm/bin/clinfo #出现以下内容即可 Number of platforms: 1 Platform Profile: FULL_PROFILE Platform Version: OpenCL 3.0 LS-APP (3581.0) Platform Name: LS Accelerated Parallel Processing Platform Vendor: Loongson Technology Platform Extensions: cl_khr_icd cl_ls_event_callback Platform Name: LS Accelerated Parallel Processing Number of devices: 1 Device Type: CL_DEVICE_TYPE_GPU Vendor ID: 14h Board name: LOONGSON LoongGPU (TM) LG200 Device Topology: PCI[ B#0, D#6, F#0 ] ......
3、yolov8n配置测试
3.1 代码下载解压
lftp https://repos.loongson.cn/loongacm/ mirror lacinfer-model-zoo sudo cd ./lacinfer-model-zoo/yolov8 sudo mkdir /opt/lsai/demo sudo mkdir /opt/lsai/demo/int8_model sudo mkdir /opt/lsai/demo/fp32_model sudo mkdir /opt/lsai/demo/images
sudo cp lacinfer_subprocess_pipeline.py /opt/lsai/demo/
sudo cp -r ./python/yolov8_infer_lacinfer.py /opt/lsai/demo/
sudo mv /opt/lsai/demo/yolov8_infer_lacinfer.py detector.py sudo cp -r ./models/fp32_model /opt/lsai/demo/fp32_model sudo cp -r ./images/ /opt/lsai/demo/images sudo cd /opt/lsai/demo/models
3.2. INT8量化:
sudo cd /opt/lsai/demo python3 ./detector.py \ --staticModelPath ./f32_model/yolov8n.onnx \ --action quant-int8 \ --calibrationPath ./images \ --saveLirs sudo mv yolov8n-quant-int8-compiled.lir ./int8_model sudo mv yolov8n-quant-int8.lir ./int8_model
3.3.调用量化后的模型:
python3 detector.py \ --staticModelPath ./int8_model/yolov8n-quant-int8-compiled.lir \ --modelFormat lir-compiled \ --imgPath ../images/person.jpg \ --cocoClassPath ../int8_model/coco.names \ --action infer
4.部署运行FastApi
建立python虚拟环境,然后部署fastapi:
sudo apt install python3.13-venv python3 -m venv venv sudo chown -R $USER:$USER /opt/lsai/demo/venv source venv/bin/activate pip install fastapi uvicorn #pip install opencv-python pip install opencv-contrib-python numpy pip install python-multipart
新建app.py文件,定义几个简单访问接口(我这里只创建了上传和访问、下载接口),代码如下:
mport io import cv2 import numpy as np from fastapi import FastAPI, File, UploadFile, HTTPException from fastapi.responses import JSONResponse, Response from detector import YOLOv8 app = FastAPI(title="YOLOv8 LacInfer 检测服务") detector = None @app.on_event("startup") def load_model(): global detector detector = YOLOv8( cocopath="./int8_model/coco.names", modelpath="./int8_model/yolov8n-quant-int8-compiled.lir", calpath="", action="infer", modelformat="lir-compiled", quantonly=False, savelirs=False, ) print("模型加载完成,服务准备就绪。") def _read_upload_image(file: UploadFile) -> np.ndarray: if not file.content_type.startswith("image/"): raise HTTPException(status_code=400, detail="请上传图片文件") contents = file.file.read() nparr = np.frombuffer(contents, np.uint8) img = cv2.imdecode(nparr, cv2.IMREAD_COLOR) if img is None: raise HTTPException(status_code=400, detail="无法解码图片") return img def _detect_and_draw(img: np.ndarray): boxes, scores, class_ids = detector.detect(img) dst = img.copy() if boxes is not None: detector.draw_detections(dst, boxes, scores, class_ids) return dst, boxes, scores, class_ids @app.post("/detect") def detect_objects(file: UploadFile = File(...)): img = _read_upload_image(file)
_, boxes, scores, class_ids = _detect_and_draw(img) if boxes is None: return {"detections": []} results = [] for box, score, cl in zip(boxes, scores, class_ids): results.append({ "bbox": [float(x) for x in box], "score": float(score), "class_id": int(cl), "class_name": detector.classNames[int(cl)] if int(cl) < len(detector.classNames) else str(cl) }) return JSONResponse(content={"detections": results}) @app.post("/detect/download") def detect_and_download(file: UploadFile = File(...)): """检测并在响应中直接返回标注后的图片,触发浏览器下载。""" img = _read_upload_image(file) dst, boxes, _, _ = _detect_and_draw(img) # 编码为 JPEG 字节流(在内存中完成,不落盘) ok, buf = cv2.imencode(".jpg", dst, [int(cv2.IMWRITE_JPEG_QUALITY), 95]) if not ok: raise HTTPException(status_code=500, detail="结果图编码失败") # 生成下载文件名:基于上传文件名 original_name = file.filename or "upload" stem = original_name.rsplit(".", 1)[0] download_name = f"{stem}_detected.jpg" headers = { # 关键:attachment 触发下载,filename 指定保存名 "Content-Disposition": f'attachment; filename="{download_name}"' } return Response(content=buf.tobytes(), media_type="image/jpeg", headers=headers) @app.post("/detect/view") def detect_and_view(file: UploadFile = File(...)): """检测并直接返回图片字节流,浏览器会内联显示(不下载)。""" img = _read_upload_image(file) dst, _, _, _ = _detect_and_draw(img) ok, buf = cv2.imencode(".jpg", dst) if not ok: raise HTTPException(status_code=500, detail="结果图编码失败") return Response(content=buf.tobytes(), media_type="image/jpeg") @app.get("/health") def health(): return {"status": "ok", "model_loaded": detector is not None}(
部署完成后通过以下命令进行启动:
python3 -m uvicorn app:app --host 0.0.0.0 --port 8000 #如果出现报错 ModuleNotFoundError: No module named 'lacinfer' 需要找到 lacinfer 实际所在的 site-packages 或 dist-packages 目录,然后把它加到虚拟环境的搜索路径里,本代码执行: echo "/opt/lacm-0.1.0/lib" > /opt/lsai/demo/venv/lib/python3.13/site-packages/lacinfer_path.pth
5.运行效果如下:(原图来源于互联网)


浙公网安备 33010602011771号