首页
网站统计
友情链接
推荐
百度一下
文心一言
通义千问
Search
1
基于 openEuler 操作系统的 VNC(noVNC) 部署流程
584 阅读
2
openEuler 操作系统用户权限管理——sudo 权限的授予与限制案例
476 阅读
3
基于 openEuler 操作系统使用 Sealos 构建 Kubernetes 高可用集群
434 阅读
4
openEuler 搭建本地 repo 源
318 阅读
5
基于 openEuler 22.03 LTS SP4 编译 docker 20.10.13
190 阅读
默认分类
openEuler
x2openEuler
云原生
生活随笔
登录
Search
标签搜索
openEuler
Docker
故宫
kubernetes
x2openEuler
Nginx
repo
VNC
SUSE
DeepSeek
Ollama
AI
wheelnext
闫志聪
累计撰写
19
篇文章
累计收到
0
条评论
首页
栏目
默认分类
openEuler
x2openEuler
云原生
生活随笔
页面
网站统计
友情链接
推荐
百度一下
文心一言
通义千问
搜索到
1
篇与
的结果
2026-03-18
wheelnext 包的构建原理、结构分析与安装流程
简介随着异构算力与多样化运行环境的普及,同一 Python 发行包在不同硬件、驱动与系统组合上的适配差异日益显著。传统“单一 wheel 适配全部环境”的分发模型通常面临两类问题:一是依赖运行时探测与兼容分支,导致部署链路复杂、行为不确定性上升;二是通过拆分多发行包实现适配,带来命名体系扩张、发布流程冗余与运维成本增加。wheelnext 引入的 Variant 机制,目标是在不破坏既有包名与版本语义的前提下,为同一版本提供可按平台能力精确匹配的 wheel 变体在该体系中,variantlib 与 uv-wheelnext 分别承担构建侧与安装侧职责。variantlib 负责对基础 wheel 注入变体元数据、生成带变体标识的产物,并输出用于分发侧索引的 variants.json;uv-wheelnext 负责在安装阶段解析变体索引、加载 provider 插件获取环境能力、执行候选变体过滤与排序,并确定最终安装目标。两者协同后,可形成“发布阶段声明差异、安装阶段自动匹配”的闭环流程本文以 vllm_ascend 为案例,围绕变体包生命周期展开分析:首先说明如何使用 variantlib 构建变体包;其次通过拆包比对定位原始包与变体包的结构差异及其来源;最后结合实际安装日志,复盘 uv-wheelnext 的识别、匹配与选择过程,建立从构建到安装的端到端技术认知1 使用 variantlib 生成变体包本章以原始包 vllm_ascend-0.13.0rc1-cp311-cp311-manylinux_2_24_x86_64.whl 为例,详述如何通过注入变体信息 ascend :: npu_type :: a2 生成变体包 vllm_ascend-0.13.0rc1-cp311-cp311-manylinux_2_24_x86_64-a2.whl,以便更好理解变体包内部结构的变化及产生变化的内容来源1.1 安装 uv-wheelnext参考文档:An experimental, variant-enabled build of uv# 执行以下命令安装 $ curl -LsSf https://astral.sh/uv/install.sh | INSTALLER_DOWNLOAD_URL=https://wheelnext.astral.sh sh # 执行以下命令刷新 PATH 环境变量 $ source $HOME/.local/bin/env # 查看版本号,可以发现命令仍为 uv,但版本已经带有 uv-wheelnext $ uv --version uv-wheelnext 0.8.41.2 安装 variantlib 工具# 克隆 variantlib 源代码 $ git clone https://github.com/wheelnext/variantlib.git # 进入克隆的 variantlib 源代码目录 $ cd variantlib # 创建虚拟环境 $ uv venv # 安装 variantlib $ uv pip install --system . # 查看版本号,确认安装是否成功 $ variantlib --version variantlib version: 0.0.31.3 生成变体包1.3.1 准备 pyproject.toml 文件编写 pyproject.toml 文件(必须):[variant.default-priorities] namespace = ["ascend"] [variant.providers.ascend] enable-if = "platform_system == 'Linux'" plugin-api = "huawei_ascend_variant_provider.plugin:AscendVariantPlugin" requires = ["huawei-ascend-variant-provider>=0.0.1,<1.0.0"]关于 pyproject.toml 文件,有以下几点注意:文件名称可以随意命名,不必须为 pyproject.tomlvariantlib 在注入变体信息过程中,只是读取 pyproject.toml,并不会对其修改该 pyproject.toml 文件与 vllm_ascend 项目本身的 pyproject.toml 并无关联,因此有两种用法:新建 pyproject.toml(可任意命名),只需写入以上的 variant 信息即可在 vllm_ascend 项目原有的 pyproject.toml 中追加 variant 信息1.3.2 生成变体包执行以下命令,注入变体信息,生成变体包:$ variantlib make-variant \ -f vllm_ascend-0.13.0rc1-cp311-cp311-manylinux_2_24_x86_64.whl \ -o ./ \ --pyproject-toml pyproject.toml \ --property "ascend :: npu_type :: a2" \ --variant-label a2 \ --skip-plugin-validationvariantlib make-variant 命令相关选项及作用如下:命令选项作用-f指定基础 wheel 包-o指定输出变体包的位置--pyproject-toml指定包含 variant 信息的 pyproject.toml--property指定变体特征--variant-label指定变体包的变体后缀,如 -a2、-a3--skip-plugin-validation跳过使用 provider 校验执行以下命令,校验变体包属性:$ variantlib analyze-wheel \ -i vllm_ascend-0.13.0rc1-cp311-cp311-manylinux_2_24_x86_64-a2.whl variantlib.commands.analyze_wheel - INFO - Filepath: `vllm_ascend-0.13.0rc1-cp311-cp311-manylinux_2_24_x86_64-a2.whl` ... is a Wheel Variant - Label: `a2` ############################## Variant: `38edb458` ############################# ascend :: npu_type :: a2 ################################################################################执行以下命令,为指定目录下的所有变体包生成索引文件:$ variantlib generate-index-json -d ./2 原始包与变体包的结构分析根据第 1 章的操作,成功构建出变体包 vllm_ascend-0.13.0rc1-cp311-cp311-manylinux_2_24_x86_64-a2.whl,以下将通过拆包对比的方法,分析注入变体信息过程中,产生了哪些变化以及变化的来源2.1 原始包与变体包名称差异原始包名称:vllm_ascend-0.13.0rc1-cp311-cp311-manylinux_2_24_x86_64.whl变体包名称:vllm_ascend-0.13.0rc1-cp311-cp311-manylinux_2_24_x86_64-a2.whl对比这两个包的名称可以发现,变体包多了一个变体后缀 -a2。关于变体后缀,参考以下说明:来源: 有以下两种来源(参考代码:variantlib/api.py:347-364)由 variantlib make-variant 命令的 --variant-label 选项指定若没有指定,则根据变体属性计算 SHA256 取前 8 位作为 label作用: 用于判断指定的包是否为变体包(参考代码:variantlib/commands/analyze_wheel.py:54-64)若变体后缀存在,则认为该包为变体包若变体后缀不存在,则认为该包为普通包2.2 原始包与变体包结构差异使用 unzip 命令分别解压原始包与变体包,查看其结构差异原始包的结构如下:. ├── vllm_ascend │ ├── ascend_config.py │ ├── ...... │ └── xlite └── vllm_ascend-0.13.0rc1.dist-info ├── entry_points.txt ├── LICENSE ├── METADATA ├── RECORD ├── top_level.txt └── WHEEL 20 directories, 20 files变体包的结构如下:. ├── vllm_ascend │ ├── ascend_config.py │ ├── ...... │ └── xlite └── vllm_ascend-0.13.0rc1.dist-info ├── entry_points.txt ├── LICENSE ├── METADATA ├── RECORD ├── top_level.txt ├── variant.json └── WHEEL 20 directories, 21 files对比原始包与变体包结构发现,在变体包的 .dist-info 目录下多出一个 variant.json 文件。关于该文件,有以下信息(参考代码:variantlib/commands/make_variant.py:241-287):该文件在注入变体信息,构建变体包时产生与其他文件相同,该文件的 SHA256 值同样会被记录到 .dist-info/RECORD 文件中:vllm_ascend-0.13.0rc1.dist-info/variant.json,sha256=3LE9xShDUHoYkI1LktyD3Dq4n0JJLM5U_DSM_DQajrg,624除该文件及 .dist-info/RECORD 文件之外,其他文件完全不变该文件的内容来源参考以下 2.3 节2.3 variant.json 文件内容的来源查看 variant.json 文件内容:{ "$schema": "https://variants-schema.wheelnext.dev/v0.0.3.json", "default-priorities": { "namespace": [ "ascend" ] }, "providers": { "ascend": { "enable-if": "platform_system == 'Linux'", "plugin-api": "huawei_ascend_variant_provider.plugin:AscendVariantPlugin", "requires": [ "huawei-ascend-variant-provider>=0.0.1,<1.0.0" ] } }, "variants": { "a2": { "ascend": { "npu_type": [ "a2" ] } } } }该文件的内容来源及作用如下(参考代码:variantlib/api.py:173-272):$schema:来源:硬编码常量 VARIANTS_JSON_SCHEMA_URL作用:标明该 variant.json 文件遵循的是 wheelnext 变体规范的 v0.0.3 版本,便于工具(如 uv-wheelnext)根据版本号正确解析支持 JSON Schema 的编辑器或工具可以据此自动校验 variant.json 的结构是否合法default-priorities:来源:variantlib make-variant 命令 --pyproject-toml 选项指定的 pyproject.toml 文件。若该文件没有包含 [variant.*] 配置信息,则字段值为空作用(参考代码:variantlib/resolver/sorting.py):控制变体候选的排序优先级,列表中靠前的 namespace 优先级更高安装时,包管理器通过 provider 插件获取当前平台支持的属性后,用此优先级对可用变体排序,选出最佳匹配providers:来源:与 default-priorities 相同作用: 定义如何加载和调用 provider 插件来获取当前平台的变体属性(参考代码:variantlib/plugins/loader.py)enable-if:环境标记表达式,安装时评估此条件决定是否加载该插件plugin-api:插件的导入路径(如 module:ClassName),用于动态加载插件实例requires:该插件的依赖包列表,安装时需要先确保这些依赖可用variants:来源:key: 与变体包的变体后缀一致,参考 2.1 原始包与变体包名称差异value: 按 namespace → feature → [values] 嵌套的属性字典,由 variantlib make-variant 命令的 --property 选项指定作用:声明该包所有已构建的变体组合及其属性值(参考代码:variantlib/resolver/filtering.py)安装时,将每个变体的属性与当前平台(通过 provider 插件查询到的)支持的属性做匹配过滤多个属性间是 AND 关系(必须全部满足),单个属性的多个 value 间是 OR 关系(满足任一即可)过滤后的变体再按 default-priorities 排序,选出最优变体安装3 uv-wheelnext 如何识别安装变体包在 a3 服务器上执行以下命令安装变体包 vllm-ascend,查看其输出日志,以分析安装流程:$ uv pip install -v --prerelease=allow \ --extra-index-url https://mirrors.huaweicloud.com/ascend/repos/pypi/variant \ vllm-ascend安装过程打印如下:# ==================== 阶段一:环境探测 ==================== DEBUG uv 0.8.4 DEBUG Searching for default Python interpreter in virtual environments DEBUG Found `cpython-3.11.14-linux-aarch64-gnu` at `/root/yzc/wheel/bin/python3` (active virtual environment) Using Python 3.11.14 environment at: wheel DEBUG Acquired lock for `wheel` DEBUG At least one requirement is not satisfied: vllm-ascend DEBUG Using request timeout of 30s DEBUG Solving with installed Python version: 3.11.14 DEBUG Solving with target Python version: >=3.11.14 DEBUG Adding direct dependency: vllm-ascend* # ==================== 阶段二:索引发现 ==================== DEBUG No cache entry for: https://mirrors.huaweicloud.com/ascend/repos/pypi/variant/vllm-ascend/ WARN Skipping file for vllm-ascend: WARN Skipping file for vllm-ascend: WARN Skipping file for vllm-ascend: WARN Skipping file for vllm-ascend: WARN Skipping file for vllm-ascend: WARN Skipping file for vllm-ascend: WARN Skipping file for vllm-ascend: WARN Skipping file for vllm-ascend: register.html DEBUG Searching for a compatible version of vllm-ascend (*) # ==================== 阶段三:变体索引获取 ==================== DEBUG No cache entry for: https://mirrors.huaweicloud.com/ascend/repos/pypi/variant/vllm-ascend/vllm_ascend-0.17.0rc1-cp311-cp311-manylinux_2_24_aarch64.whl DEBUG No cache entry for: https://mirrors.huaweicloud.com/ascend/repos/pypi/variant/vllm-ascend/vllm_ascend-0.17.0rc1-variants.json # ==================== 阶段四:Provider 插件查询 ==================== DEBUG Querying provider `ascend` for variants DEBUG Using base executable for virtual environment: /usr/local/python3.11.14/bin/python3.11 DEBUG Solving with installed Python version: 3.11.14 DEBUG Solving with target Python version: >=3.11.14 DEBUG Adding direct dependency: huawei-ascend-variant-provider>=0.0.2, <1.0.0 DEBUG No cache entry for: https://mirrors.huaweicloud.com/ascend/repos/pypi/variant/huawei-ascend-variant-provider/ DEBUG Searching for a compatible version of huawei-ascend-variant-provider (>=0.0.2, <1.0.0) DEBUG Selecting: huawei-ascend-variant-provider==0.0.2 [compatible] (huawei_ascend_variant_provider-0.0.2-py3-none-any.whl) DEBUG No cache entry for: https://mirrors.huaweicloud.com/ascend/repos/pypi/variant/huawei-ascend-variant-provider/huawei_ascend_variant_provider-0.0.2-py3-none-any.whl DEBUG Tried 1 versions: huawei-ascend-variant-provider 1 DEBUG marker environment resolution took 0.193s DEBUG Installing in huawei-ascend-variant-provider==0.0.2 in /root/.cache/uv/wheelnext-builds-v0/.tmpuuXXg1 DEBUG Identified uncached distribution: huawei-ascend-variant-provider==0.0.2 (huawei_ascend_variant_provider-0.0.2-py3-none-any.whl) DEBUG Downloading and building requirement for build: huawei-ascend-variant-provider==0.0.2 DEBUG No cache entry for: https://mirrors.huaweicloud.com/ascend/repos/pypi/variant/huawei-ascend-variant-provider/huawei_ascend_variant_provider-0.0.2-py3-none-any.whl DEBUG Installing build requirement: huawei-ascend-variant-provider==0.0.2 # ==================== 阶段五:变体选择与安装 ==================== DEBUG Using variant wheel vllm_ascend-0.17.0rc1-cp311-cp311-manylinux_2_24_aarch64-a3.whl DEBUG Selecting: vllm-ascend==0.17.0rc1 [compatible] (vllm_ascend-0.17.0rc1-cp311-cp311-manylinux_2_24_aarch64-a3.whl) DEBUG Adding transitive dependency for vllm-ascend==0.17.0rc1: cmake>=3.26 DEBUG Adding transitive dependency for vllm-ascend==0.17.0rc1: decorator* ......根据以上安装日志,uv-wheelnext 识别并安装变体包的完整流程可分为五个阶段3.1 环境探测DEBUG Searching for default Python interpreter in virtual environments DEBUG Found `cpython-3.11.14-linux-aarch64-gnu` at `/root/yzc/wheel/bin/python3` DEBUG Solving with installed Python version: 3.11.14uv-wheelnext 首先探测当前 Python 环境:确定解释器版本(3.11.14)确定平台架构(linux-aarch64)确定 ABI 标签(cp311)这些信息将作为后续 wheel 兼容性过滤的基础条件3.2 索引发现DEBUG No cache entry for: .../vllm-ascend/ DEBUG Searching for a compatible version of vllm-ascend (*)uv-wheelnext 向 --extra-index-url 指定的变体索引源发起请求,获取 vllm-ascend 的可用版本列表此阶段与标准 pip 安装一致,遍历索引页面中的所有文件链接,跳过不兼容的文件(如 HTML 页面、不匹配的平台标签等)3.3 变体索引获取DEBUG No cache entry for: .../vllm_ascend-0.17.0rc1-cp311-cp311-manylinux_2_24_aarch64.whl DEBUG No cache entry for: .../vllm_ascend-0.17.0rc1-variants.json这是 uv-wheelnext 区别于标准 uv 的核心步骤。在找到兼容的 wheel 文件后,uv-wheelnext 会额外请求同目录下的 {name}-{version}-variants.json 文件。该文件由 variantlib generate-index-json 命令预先生成,其内容与结构如见 2.3 variant.json 文件内容的来源variants.json 是变体包的索引文件,它声明了该版本所有可用的变体标签及其属性,以及对应的 provider 插件信息。uv-wheelnext 正是通过该文件发现"此包存在变体",从而进入变体解析流程。3.4 Provider 插件查询DEBUG Querying provider `ascend` for variants DEBUG Adding direct dependency: huawei-ascend-variant-provider>=0.0.2, <1.0.0 DEBUG Installing build requirement: huawei-ascend-variant-provider==0.0.2uv-wheelnext 从 variants.json 的 providers 字段中读取 provider 插件信息,执行以下操作:解析 requires 字段,将 huawei-ascend-variant-provider>=0.0.2,<1.0.0 作为临时依赖进行解析和安装将 provider 插件安装到隔离的临时环境 /root/.cache/uv/wheelnext-builds-v0/.tmpuuXXg1,避免污染用户环境通过 plugin-api 字段指定的入口点(huawei_ascend_variant_provider.plugin:AscendVariantPlugin)加载插件实例调用插件的 get_supported_configs() 方法,查询当前平台支持的变体属性(参考代码:variantlib/api.py:68-78)例如在昇腾 a3 设备上,provider 插件会返回 ascend :: npu_type :: a3,表示当前平台支持该变体属性3.5 变体匹配、排序与选择DEBUG Using variant wheel vllm_ascend-0.17.0rc1-cp311-cp311-manylinux_2_24_aarch64-a3.whl DEBUG Selecting: vllm-ascend==0.17.0rc1 [compatible]获取到平台支持的变体属性后,uv-wheelnext 将完成最终选择,具体步骤如下:过滤(filter_variants):遍历 variants.json 中声明的所有变体,将每个变体的属性与平台支持的属性进行匹配。多个属性间为 AND 关系(必须全部满足),单个属性的多个 value 间为 OR 关系(满足任一即可)。不兼容的变体被淘汰注入 Null Variant:始终将空属性的 null variant 加入候选列表作为兜底,确保即使没有匹配的变体,也能回退到基础包排序(sort_variants_descriptions):根据 default-priorities 中定义的 namespace、feature、property 优先级,对通过过滤的变体进行排序,优先级高的排在前面选择:取排序后的第一个变体作为最优匹配。本例中,变体 a3(属性 ascend :: npu_type :: a3)与当前平台完全匹配,因此 uv-wheelnext 最终选择安装 vllm_ascend-0.17.0rc1-cp311-cp311-manylinux_2_24_aarch64-a3.whl
2026年03月18日
1 阅读
0 评论
0 点赞