vLLM + Qwen3.6 视频推理踩坑记录
vLLM + Qwen3.6 视频推理踩坑记录:AV1、OpenCV 与视频采样问题 Info 之前 qwen3.6-27b 模型发布后没多久我就部署他 并且测试过视频能力,一直是公司内部署的主力离线大模型。 所以我认为一直可用,但是今天同事提了个新的需求,要从视频中找出属于广告部分的内容裁剪掉。我首先给出的方案是 用 Qwen3-ASR+Qwen3-ForcedAligner 模型来获取 文本内容以及时间轴,再用 LLM 来判断哪些文本属于广告内容,随后根据文本所对应的时间轴裁剪视频,先这样子给同事搭建了环境让他去跑几个试试,同时我来试试直接让 qwen3.6 读视频是否可行。结果一来就给我个报错 环境 1 2 3 4 5 6 7 8 9 10 11 12 13 14 Model: Qwen3.6-27B BF16 vLLM: 0.19.1 Transformers: 5.6.0 Python: 3.12 4*RTX 3090 24GB 显示已折叠代码(18 行) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 启动参数: vllm serve /data/huggingface_model/Qwen/Qwen3.6-27B \ --served-model-name qwen3.6-27b \ --port 13539 \ --tensor-parallel-size 4 \ --max-model-len 65536 \ --reasoning-parser qwen3 \ --enable-auto-tool-choice \ --tool-call-parser qwen3_coder \ --gpu-memory-utilization 0.90 \ --max-num-seqs 4 \ --enable-prefix-caching \ --enable-chunked-prefill \ --disable-custom-all-reduce \ --allowed-local-media-path /<指定目录> \ --media-io-kwargs '{"video":{"num_frames":64}}' \ --mm-processor-kwargs '{"fps":1,"do_sample_frames":false}' 这里的 --media-io-kwargs 是给 vLLM 多模态视频读取器传额外参数的。video.num_frames=64 表示整段视频送进模型前目标采样 64 帧,不是每秒采样 64 帧。比如一个 10 秒、25 FPS 的视频,原本大约有 250 帧,最后会在整段视频的时间范围内均匀取 64 帧,平均下来大约相当于 6.4 FPS。 ...
什么是 CUDA:用 Java 世界的类比看懂 Driver / Toolkit / PyTorch / Conda
AI 开发配置 conda / cuda / pytorch / nvidia-driver 很容易混淆,让人头疼,实际上踩过几次坑就能摸清它们的概念和关系了。本文尝试用 Java 开发者熟悉的语言,对照解释几个常见概念。 GPU 世界 Java 世界 作用 GPU 硬件 CPU 真正执行计算 NVIDIA Driver JVM(HotSpot) 控制硬件、执行程序 CUDA Toolkit JDK 给开发者写程序用 nvcc javac 编译器 libcudart.so Java Runtime Library 运行时库 cuBLAS/cuDNN Netty、Apache Commons 等第三方库 提供高性能计算能力 PyTorch Spring Boot 应用框架 conda SDKMAN / Maven + 环境管理 管理版本 下面一点一点讲。 第一层:GPU Driver(最重要) 先理解一件事:GPU 本身不会执行 CUDA C++。 GPU 最终执行的是一种叫做 SASS 的机器码。 整个过程实际上是: ...
chatgpt 你不打算 chat 了吗
自从更新 chatgpt 和 codex 之后,我手贱的把 chatgpt classic 给卸载了,现在找不回来了,我怀念我的 option+space openai 是不打算继续服务普通 chat 用户了吗,或者应该把那个功能恢复吧 2026 年 7 月 14 日 21:35:28 哦哦 找到解决方法了,mac 用户可以直接用 homebrew 安装回来 brew install --cask chatgpt-classic 2026 年 7 月 14 日 21:47:06
什么是序列化和反序列化
理论上 这是基础中的基础,但是说实话越是基础越是不容易去细看,我一直只有模糊的概念,比如以Java为例,一个对象返回给前端是用的 json,对象->json 的过程就是序列化,json 到对象都过程就是反序列化,但是具体是对错与否,帮我进行这个操作的函数、框架下面是不是还有更多内容,却从未深究,这次水一篇博客来讲一讲这是什么意思 定义 互联网的产生带来了机器间通讯的需求,而互联通讯的双方需要采用约定的协议,序列化和反序列化属于通讯协议的一部分。通讯协议往往采用分层模型,不同模型每层的功能定义以及颗粒度不同,例如:TCP/IP协议是一个四层协议,而OSI模型却是七层协议模型。在OSI七层协议模型中展现层(Presentation Layer)的主要功能是把应用层的对象转换成一段连续的二进制串,或者反过来,把二进制串转换成应用层的对象–这两个功能就是序列化和反序列化。一般而言,TCP/IP协议的应用层对应与OSI七层协议模型的应用层,展示层和会话层,所以序列化协议属于TCP/IP协议应用层的一部分。本文对序列化协议的讲解主要基于OSI七层协议模型。 序列化: 将数据结构或对象转换成二进制串的过程 反序列化:将在序列化过程中所生成的二进制串转换成数据结构或者对象的过程 这里摘自 美团技术团队 15 年的文章,我也就从这里开始引入吧 通俗比喻 假设你家有很多家具:沙发、电视、冰箱、床…… 搬家的时候,你得把它们拆开、装进箱子,贴上标签 —— 这就是序列化。 到了新家,打开箱子、按照标签重新组装、恢复成原来的样子 —— 这就是反序列化。 由浅入深 现在从最常见的序列化协议入手,先是 json ,这个在现代系统里面最常见了,打开web 也好,网络请求很多都是用 json 传输内容的。那么 who is ‘Json’ json 1 2 3 4 { "name": "Ray", "age": 25 } 大概就长这样,如果我把它放到 Java 对象里面 它可以是这样的 java 1 2 3 User user = new User(); user.setName("Ray"); user.setAge(25); 这个 user 实际上存在于内存中。 而 Java 内存里是怎么存的? 栈(Stack)里只保存引用:user → 0x1008 真正的数据在堆(Heap)里面: 1 2 3 4 5 6 7 8 9 10 11 12 13 0x1008 (User 对象) ┌──────────────────────────────┐ │ Object Header │ │ klass pointer │ │ │ │ name ───→ 0x2010 │ │ age = 25 │ └──────────────────────────────┘ 0x2010 (String 对象) ┌─────────────┐ │ value="Ray" │ └─────────────┘ ...
把 Qwen3-VL 塞进 RK3588:一次端侧 VL Agent 的小实验
昨天刷到一个 AI 移动硬盘的广告,结合前段时间老板和我说的 AI NAS,本来没怎么放在心上,因为我本身不会是前者的客户,后者又不是小公司能做的,不过整理硬件的时候,发现一个 Frefly 的 RK3588 盒子,灵机一动、RK3588 有 NPU,理论肯定有人做这个端侧LLM 的推理。 AI 移动硬盘 比如一个相册管理器。照片都在本地,模型在本地看图、打标签、生成描述、回答“帮我找去年海边那张有红色帐篷的照片”之类的问题。隐私不出设备,速度也足够交互。这个方向如果成立,小模型就不是“缩水版云模型”,而是一个很适合本地数据管理的入口。 话不多说,现成的代码开始一键运行。 硬件和模型 板子信息: 项目 配置 板子 Firefly AIO-3588L SoC RK3588 内存 8GB 系统 Ubuntu 22.04.5 Kernel 6.1.118 NPU driver 0.9.8 模型选的是已经转换好的 RKLLM/RKNN 版本: 文件 作用 大小 qwen3-vl-2b-instruct_w8a8_rk3588.rkllm LLM decoder 约 2.3GB qwen3-vl-2b_vision_rk3588.rknn vision encoder 约 812MB 空间占用如下 bash 1 2 3 4 5 firefly@firefly:/userdata/rkllm_demo$ df -h / Filesystem Size Used Avail Use% Mounted on overlayroot 52G 6.0G 44G 13% / firefly@firefly:/userdata/rkllm_demo$ du -sh . 3.2G . 第一版:能跑,但速度不对劲 最开始我用官方 multimodal C++ demo 包了一层 FastAPI,再写了一个简单网页。网页支持: ...