msprechecker


Namemsprechecker JSON
Version 0.1.0 PyPI version JSON
download
home_pageNone
SummaryMindStudio Prechecker
upload_time2025-08-08 07:44:20
maintainerNone
docs_urlNone
authorNone
requires_python>=3.7
licenseApache-2.0
keywords ms prechecker
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # MS Prechecker
- [MS Prechecker](#ms-prechecker)
- [基本功能](#基本功能)
- [环境要求](#环境要求)
- [安装性能预检工具](#安装性能预检工具)
- [预检](#预检)
  - [预检快速使用](#预检快速使用)
- [落盘和比对](#落盘和比对)
  - [落盘快速使用](#落盘快速使用)
  - [落盘文件介绍](#落盘文件介绍)
  - [比对快速使用](#比对快速使用)
  - [比对结果说明](#比对结果说明)
- [自定义检查项配置](#自定义检查项配置)
  - [自定义检查项配置使用说明](#自定义检查项配置使用说明)
    - [字段引用](#字段引用)
    - [版本引用](#版本引用)
- [参数列表](#参数列表)
  - [通用参数](#通用参数)
  - [precheck 额外参数](#precheck-额外参数)
  - [dump 额外参数](#dump-额外参数)
  - [compare 参数](#compare-参数)

# 基本功能
  预检工具是一个帮助用户快速部署服务,快速复现基线,快速定位问题的工具。能提供推理前预检,推理中落盘和推理后比对的功能。
  - [**预检**](#预检快速使用):检测各种可能会影响服务部署或者性能的组件,包括但不限于:
    - 通用检查:检测 CPU 高性能是否开启,透明大页状态,是否为虚拟机,内核版本或昇腾驱动版本是否过低等
    - PD 混部场景:检测环境变量,检测部署服务的 config.json 字段是否合理,检测均通过百分百可以部署成功
    - PD 分离场景:检测 `user_config.json` 和 `mindie_env.json` 字段是否合理,检测均通过百分百可以部署成功
    - 模型权重检查:检测权重数量、权重哈希、以及 config.json 中的 `transformers_version` 字段是否小于当前机器的 `transformers` 版本
    - 网络检查:根据 `rank table`,检测各机器芯片之间的连通性,检测各机器相互之间能否 ping 通等
  - [**落盘**](#落盘和比对):收集各种环境结果并保存到指定路径中,包括但不限于:
    - `env`:环境变量信息
    - `conf`:配置文件字段全量收集,如 `user_config.json` 等
    - `sys`:系统信息收集,如内核版本等
  - [**比对**](#落盘和比对):根据不同机器落盘结果进行比对,便于快速发现差异点

# 环境要求
  - Python 版本要求 >= 3.7
  - 第三方依赖包括:`psutil`, `pyyaml` 和 `importlib_metadata`
  - 相关检测项支持:`800I A2`, `800I A3` 和 `G8600`

# 安装性能预检工具
**以下方式选择一种即可**
  - **PyPI 安装(推荐)**
    ```sh
    pip install msprechecker
    ```
  - **离线安装**
    - 在能够访问网络的机器上,访问 [PyPI 官方源](https://pypi.org/project/msprechecker/#files)
    - 左侧点击 `Download files`,随后点击 `Built Distribution` 下方链接进行下载,如下图所示:

      ![image](./pics/image.png)
    - 下载完成后,上传到服务器中
    - 假设 wheel 包存放路径为 `whl_path`,输入下列命令进行安装
      ```bash
      pip install whl_path
      ```
    - 终端输入 `msprechecker` 校验是否安装成功

# 预检
## 预检快速使用
  - 默认进行环境变量、系统配置的校验
    ```sh
    msprechecker precheck
    ```
    随后会在终端出现打印信息,如果有环境变量的检查项,则在当前目录下生成配置建议环境变量的 `msprechecker_env.sh` 文件
  - K8S 部署时指定 user_config.json 检查和 mindie_env.json 的检查
    ```sh
    msprechecker precheck -user user_config.json --mindie_env_config_path mindie_env.json
    ```
  - 双机 DS model 检查
    ```sh
    msprechecker precheck -ch model --weight_dir <权重路径>
    ```
  - 双机 DS hccl 检查
    ```sh
    msprechecker precheck -ch hccl --ranktable <rank table 路径>
    ```
  - cpu 和 npu 压测
    ```sh
    msprechecker precheck -ch hardware
    ```
  - cpu 和 npu 压测,以及多机网络连接状态检查
    ```sh
    msprechecker precheck -ch hardware --ranktable <rank table 路径>
    ```

# 落盘和比对
## 落盘快速使用
  - 推理过程中,如果出现 **异常** 或者 ​**性能不及预期**​,可以使用 ​**落盘** 功能​,将环境相关信息进行落盘,方便后续比对。推理结束后,性能预检工具支持比对推理中落盘的环境变量和配置项,帮助快速发现可能影响性能的差异点,实现问题快速定位
  - 使用落盘功能只需在终端中输入
    ```bash
    msprechecker dump -d abc
    # msprechecker_logger - INFO - dump file saved to: abc
    ```
    其中 `dump` 表明我们使用落盘功能。通过 `--dump_file_path` 或缩写 `-d` 参数指定自定义落盘文件路径。运行结束后会在当前目录下落盘环境变量信息文件 `abc`

## 落盘文件介绍
  - 落盘文件内容结构如下:

    ![image](./pics/dump_file_1.png)

    - 第一块为 MindIE 服务化配置,即当前环境 MindIE 服务化 config.json 参数
    - 第二块为环境变量,为当前终端所有环境变量值
    - 第三块为网络配置,包括 HCCL 连通校验的信息
    - 第四块为系统配置,包括系统信息、内核发行版、CANN 驱动信息、是否为虚拟机以及是否开启 CPU 高性能
## 比对快速使用
  - 在进行比对前,请确保使用预检工具落盘两个或多个文件,单个文件无法比对。以下示例假设存在两个落盘文件,路径为 `path_a` 和 `path_b`,则您可以使用如下命令进行比对
    ```bash
    msprechecker compare -d path_a path_b
    ```
    其中 `compare` 表明我们使用比对功能,`-d` 为参数 `--dump_file_path` 的缩写,也可以使用 `--dump_file_path` 进行比对,后接两个或多个文件路径,性能预检工具会一起执行比对,展示差异
## 比对结果说明
  - 如果两个或多个落盘文件没有差异,则会在终端出现如下打印信息:
    ```bash
    msprechecker_logger - INFO - == compare start ==
    msprechecker_logger - INFO - No difference found
    msprechecker_logger - INFO - == compare end ==
    ```
  - 如果两个或多个落盘文件存在差异,则会在终端展示差异项。比如,展示内容为:
    ```bash
    - key .Env.CPU_AFFINITY_CONF diffs
      * b:
        type<NoneType> : None
      * c:
        type<str> : 2
      * d:
        type<str> : 2
      * e:
        type<str> : 2
    ```
    表明环境变量 `CPU_AFFINITY_CONF` 在四个文件 `b`, `c`, `d`, `e` 中存在差异。其中 `b` 文件中,该环境变量的值为 `None`,即没有设置该环境变量;而 `c`, `d`, `e` 均设置为 2
***

# 自定义检查项配置
## 自定义检查项配置使用说明
在进行 precheck 预检时,支持自定义配置校验项。目前仅支持 `user_config.json` 和 `mindie_env.json` 的配置校验,后续开放环境变量的自定义校验。
假设需要校验 `a.b` 的值是否符合要求,那么自定义配置语法如下
```sh
a:
  b:
    expected:
      type: eq
      value: 1 + 2
    reason: a.b 的值应该等于 3
    severity: high
```
上述配置表示,`a.b` 的值应该等于 3,其严重程度为 high,如果该字段不符合预期,会显示 `[NOK]`

目前,
- `type` 支持:`eq`, `lt`, `le`, `gt`, `ge`, `ne` 或者 `==`, `<`, `<=`, `>`, `>=`, `!=`
- `value` 支持:`+`, `-`, `*`, `/`, `//`, `**`, `()`,还支持字段引用 `${}`, 版本符号 `Version{}` 以及权限符号 `FilePerm{}`
- `reason` 支持任意字符串
- `severity` 支持:`low`, `medium`, `high`,不填写默认 `high`。其中,`low` 显示为 `[RECOMMEND]`;`medium` 显示为 `[WARNING]`;`high` 显示为 `[NOK]`

### 字段引用
对于比较嵌套较深的配置文件,遇到不同字段相互关联的场景时,创建校验规则是一个挑战。预检工具支持 **字段引用** 语法,允许用户通过 `${}` 的语法来引用其他位置的字段值。比如,有如下配置文件
```json
{
  "a": {
    "b": "value of b",
    "c": "value of c"
  }
}
```
如果希望 `a.b` 的值和 `a.c` 的值相等,则校验规则如下:
```yaml
a:
  b:
    expected:
      type: eq
      value: ${.c}
    reason: a.b 的值等于 a.c
    severity: high
  c:
  expected:
      type: eq
      value: ${a.b}
    reason: a.c 的值等于 a.b
    severity: high
```
其中 `${.c}` 是相对引用, `${a.b}` 是绝对引用;对于大型嵌套的配置文件尤其好用。

### 版本引用
如果校验涉及到版本比较,比如低于多少版本时会导致有问题,可以使用版本引用。比如 `transformers_version` 版本需要大于 `4.33`,则可以写为
```yaml
transformers_version:
  expected:
    type: gt
    value: Version{4.33}
  reason: xx
  severity: xx
```
内置了 `Version` 的比较规则,目前是 `8.0.0 > 8.0.rc2 > 8.0.rc1 > 8.0.rc1.b020`。对于 T 版本暂不支持校验,因为 T 版本没有规律

# 参数列表
  - 子功能包括 `precheck` / `dump` / `compare`
  - 通过 `msprechecker -h` 获取子功能列表,以及 `msprechecker {子功能} -h` 获取对应子功能的参数列表
## 通用参数
<a id="1"></a>
以下通用参数适用于 `msprechecker precheck` 和 `msprechecker dump`,不适用于 `msprechecker compare`
  | 参数名                          | 参数描述                                                                                        | 是否必选                                    |
  | ------------------------------- | ----------------------------------------------------------------------------------------------- | ------------------------------------------- |
  | -ch {...}, --checkers {...}     | *字符串列表值,可选值 basic,hccl,model,hardware,all,指定检查项,可指定多个,all 表示全部        | 否,默认值 basic                            |
  | -service, --service_config_path | 字符串值,MINDIE service 路径或 config json 文件路径,优先级高于环境变量的 MIES_INSTALL_PATH 值 | 否,默认使用环境变量的 MIES_INSTALL_PATH 值 |
  | -user, --user_config_path       | 字符串值,json 文件,k8s user_config.json 文件,不指定则不检查                                    | 否,默认 None                               |
  | --mindie_env_config_path        | 字符串值,json 文件,k8s mindie_env.json 文件,不指定则不检查                                     | 否,默认 None                               |
  | -ranktable, --ranktable_file    | 字符串值,json 文件,手动指定 ranktable 文件,优先级高于环境变量的 RANKFILETABLE                | 否,默认使用环境变量的 RANKFILETABLE 值     |
  | --weight_dir   |  模型权重目录路径        | 否,默认使用 config.json 中的 `modelWeightPath` 字段路径   |
  | -blocknum, --sha256_blocknum    | int 值,计算模型权重 sha256sum 值时的采样块数,值越大采样越多,计算速度越慢                     | 否,默认 1000                               |
  | -add, --additional_checks_yaml  | 字符串值,yaml 文件,额外的自定义配置项,指定后将覆盖默认检查项中的值                           | 否,默认 None                               |
  | -l {...}, --log_level {...}     | 日志级别,可选值 debug,info,warning,error,fatal,critical                                        | 否,默认 info                               |

  - `basic` 表示检查环境变量以及基本系统信息
  - `hccl` 表示检查 NPU 之间通过 hccl 连接的状态
  - `model` 表示检查或比对模型大小以及 sha256sum 值
  - `hardware` 表示检查 CPU / NPU 计算能力,以及网络连接状态
  - `all` 表示检查全部
## precheck 额外参数
  | 参数名         | 参数描述                                             | 是否必选                       |
  | -------------- | ---------------------------------------------------- | ------------------------------ |
  | -s, --save_env | 字符串值,指定环境变量需要优化时,输出的 sh 文件路径 | 否,默认为 msprechecker_env.sh |
## dump 额外参数
  | 参数名               | 参数描述                           | 是否必选                                            |
  | -------------------- | ---------------------------------- | --------------------------------------------------- |
  | -d, --dump_file_path | 字符串值,指定 dump 数据的保存路径 | 否,默认为 /tmp/msprechecker_dump_{time_stamp}.json |
## compare 参数
  | 参数名                      | 参数描述                                                 | 是否必选       |
  | --------------------------- | -------------------------------------------------------- | -------------- |
  | dump_file_paths             | **位置参数**,字符串列表值,指定 dump 的多份数据         | 是,且应为多个 |
  | -l {...}, --log_level {...} | 日志级别,可选值 debug,info,warning,error,fatal,critical | 否,默认 info  |

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "msprechecker",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.7",
    "maintainer_email": null,
    "keywords": "ms, prechecker",
    "author": null,
    "author_email": null,
    "download_url": "https://files.pythonhosted.org/packages/61/75/01bc916e91e596f6b3177585278ce30cfaafaa0354f892549520f65d0eea/msprechecker-0.1.0.tar.gz",
    "platform": null,
    "description": "# MS Prechecker\n- [MS Prechecker](#ms-prechecker)\n- [\u57fa\u672c\u529f\u80fd](#\u57fa\u672c\u529f\u80fd)\n- [\u73af\u5883\u8981\u6c42](#\u73af\u5883\u8981\u6c42)\n- [\u5b89\u88c5\u6027\u80fd\u9884\u68c0\u5de5\u5177](#\u5b89\u88c5\u6027\u80fd\u9884\u68c0\u5de5\u5177)\n- [\u9884\u68c0](#\u9884\u68c0)\n  - [\u9884\u68c0\u5feb\u901f\u4f7f\u7528](#\u9884\u68c0\u5feb\u901f\u4f7f\u7528)\n- [\u843d\u76d8\u548c\u6bd4\u5bf9](#\u843d\u76d8\u548c\u6bd4\u5bf9)\n  - [\u843d\u76d8\u5feb\u901f\u4f7f\u7528](#\u843d\u76d8\u5feb\u901f\u4f7f\u7528)\n  - [\u843d\u76d8\u6587\u4ef6\u4ecb\u7ecd](#\u843d\u76d8\u6587\u4ef6\u4ecb\u7ecd)\n  - [\u6bd4\u5bf9\u5feb\u901f\u4f7f\u7528](#\u6bd4\u5bf9\u5feb\u901f\u4f7f\u7528)\n  - [\u6bd4\u5bf9\u7ed3\u679c\u8bf4\u660e](#\u6bd4\u5bf9\u7ed3\u679c\u8bf4\u660e)\n- [\u81ea\u5b9a\u4e49\u68c0\u67e5\u9879\u914d\u7f6e](#\u81ea\u5b9a\u4e49\u68c0\u67e5\u9879\u914d\u7f6e)\n  - [\u81ea\u5b9a\u4e49\u68c0\u67e5\u9879\u914d\u7f6e\u4f7f\u7528\u8bf4\u660e](#\u81ea\u5b9a\u4e49\u68c0\u67e5\u9879\u914d\u7f6e\u4f7f\u7528\u8bf4\u660e)\n    - [\u5b57\u6bb5\u5f15\u7528](#\u5b57\u6bb5\u5f15\u7528)\n    - [\u7248\u672c\u5f15\u7528](#\u7248\u672c\u5f15\u7528)\n- [\u53c2\u6570\u5217\u8868](#\u53c2\u6570\u5217\u8868)\n  - [\u901a\u7528\u53c2\u6570](#\u901a\u7528\u53c2\u6570)\n  - [precheck \u989d\u5916\u53c2\u6570](#precheck-\u989d\u5916\u53c2\u6570)\n  - [dump \u989d\u5916\u53c2\u6570](#dump-\u989d\u5916\u53c2\u6570)\n  - [compare \u53c2\u6570](#compare-\u53c2\u6570)\n\n# \u57fa\u672c\u529f\u80fd\n  \u9884\u68c0\u5de5\u5177\u662f\u4e00\u4e2a\u5e2e\u52a9\u7528\u6237\u5feb\u901f\u90e8\u7f72\u670d\u52a1\uff0c\u5feb\u901f\u590d\u73b0\u57fa\u7ebf\uff0c\u5feb\u901f\u5b9a\u4f4d\u95ee\u9898\u7684\u5de5\u5177\u3002\u80fd\u63d0\u4f9b\u63a8\u7406\u524d\u9884\u68c0\uff0c\u63a8\u7406\u4e2d\u843d\u76d8\u548c\u63a8\u7406\u540e\u6bd4\u5bf9\u7684\u529f\u80fd\u3002\n  - [**\u9884\u68c0**](#\u9884\u68c0\u5feb\u901f\u4f7f\u7528)\uff1a\u68c0\u6d4b\u5404\u79cd\u53ef\u80fd\u4f1a\u5f71\u54cd\u670d\u52a1\u90e8\u7f72\u6216\u8005\u6027\u80fd\u7684\u7ec4\u4ef6\uff0c\u5305\u62ec\u4f46\u4e0d\u9650\u4e8e\uff1a\n    - \u901a\u7528\u68c0\u67e5\uff1a\u68c0\u6d4b CPU \u9ad8\u6027\u80fd\u662f\u5426\u5f00\u542f\uff0c\u900f\u660e\u5927\u9875\u72b6\u6001\uff0c\u662f\u5426\u4e3a\u865a\u62df\u673a\uff0c\u5185\u6838\u7248\u672c\u6216\u6607\u817e\u9a71\u52a8\u7248\u672c\u662f\u5426\u8fc7\u4f4e\u7b49\n    - PD \u6df7\u90e8\u573a\u666f\uff1a\u68c0\u6d4b\u73af\u5883\u53d8\u91cf\uff0c\u68c0\u6d4b\u90e8\u7f72\u670d\u52a1\u7684 config.json \u5b57\u6bb5\u662f\u5426\u5408\u7406\uff0c\u68c0\u6d4b\u5747\u901a\u8fc7\u767e\u5206\u767e\u53ef\u4ee5\u90e8\u7f72\u6210\u529f\n    - PD \u5206\u79bb\u573a\u666f\uff1a\u68c0\u6d4b `user_config.json` \u548c `mindie_env.json` \u5b57\u6bb5\u662f\u5426\u5408\u7406\uff0c\u68c0\u6d4b\u5747\u901a\u8fc7\u767e\u5206\u767e\u53ef\u4ee5\u90e8\u7f72\u6210\u529f\n    - \u6a21\u578b\u6743\u91cd\u68c0\u67e5\uff1a\u68c0\u6d4b\u6743\u91cd\u6570\u91cf\u3001\u6743\u91cd\u54c8\u5e0c\u3001\u4ee5\u53ca config.json \u4e2d\u7684 `transformers_version` \u5b57\u6bb5\u662f\u5426\u5c0f\u4e8e\u5f53\u524d\u673a\u5668\u7684 `transformers` \u7248\u672c\n    - \u7f51\u7edc\u68c0\u67e5\uff1a\u6839\u636e `rank table`\uff0c\u68c0\u6d4b\u5404\u673a\u5668\u82af\u7247\u4e4b\u95f4\u7684\u8fde\u901a\u6027\uff0c\u68c0\u6d4b\u5404\u673a\u5668\u76f8\u4e92\u4e4b\u95f4\u80fd\u5426 ping \u901a\u7b49\n  - [**\u843d\u76d8**](#\u843d\u76d8\u548c\u6bd4\u5bf9)\uff1a\u6536\u96c6\u5404\u79cd\u73af\u5883\u7ed3\u679c\u5e76\u4fdd\u5b58\u5230\u6307\u5b9a\u8def\u5f84\u4e2d\uff0c\u5305\u62ec\u4f46\u4e0d\u9650\u4e8e\uff1a\n    - `env`\uff1a\u73af\u5883\u53d8\u91cf\u4fe1\u606f\n    - `conf`\uff1a\u914d\u7f6e\u6587\u4ef6\u5b57\u6bb5\u5168\u91cf\u6536\u96c6\uff0c\u5982 `user_config.json` \u7b49\n    - `sys`\uff1a\u7cfb\u7edf\u4fe1\u606f\u6536\u96c6\uff0c\u5982\u5185\u6838\u7248\u672c\u7b49\n  - [**\u6bd4\u5bf9**](#\u843d\u76d8\u548c\u6bd4\u5bf9)\uff1a\u6839\u636e\u4e0d\u540c\u673a\u5668\u843d\u76d8\u7ed3\u679c\u8fdb\u884c\u6bd4\u5bf9\uff0c\u4fbf\u4e8e\u5feb\u901f\u53d1\u73b0\u5dee\u5f02\u70b9\n\n# \u73af\u5883\u8981\u6c42\n  - Python \u7248\u672c\u8981\u6c42 >= 3.7\n  - \u7b2c\u4e09\u65b9\u4f9d\u8d56\u5305\u62ec\uff1a`psutil`, `pyyaml` \u548c `importlib_metadata`\n  - \u76f8\u5173\u68c0\u6d4b\u9879\u652f\u6301\uff1a`800I A2`, `800I A3` \u548c `G8600`\n\n# \u5b89\u88c5\u6027\u80fd\u9884\u68c0\u5de5\u5177\n**\u4ee5\u4e0b\u65b9\u5f0f\u9009\u62e9\u4e00\u79cd\u5373\u53ef**\n  - **PyPI \u5b89\u88c5\uff08\u63a8\u8350\uff09**\n    ```sh\n    pip install msprechecker\n    ```\n  - **\u79bb\u7ebf\u5b89\u88c5**\n    - \u5728\u80fd\u591f\u8bbf\u95ee\u7f51\u7edc\u7684\u673a\u5668\u4e0a\uff0c\u8bbf\u95ee [PyPI \u5b98\u65b9\u6e90](https://pypi.org/project/msprechecker/#files)\n    - \u5de6\u4fa7\u70b9\u51fb `Download files`\uff0c\u968f\u540e\u70b9\u51fb `Built Distribution` \u4e0b\u65b9\u94fe\u63a5\u8fdb\u884c\u4e0b\u8f7d\uff0c\u5982\u4e0b\u56fe\u6240\u793a\uff1a\n\n      ![image](./pics/image.png)\n    - \u4e0b\u8f7d\u5b8c\u6210\u540e\uff0c\u4e0a\u4f20\u5230\u670d\u52a1\u5668\u4e2d\n    - \u5047\u8bbe wheel \u5305\u5b58\u653e\u8def\u5f84\u4e3a `whl_path`\uff0c\u8f93\u5165\u4e0b\u5217\u547d\u4ee4\u8fdb\u884c\u5b89\u88c5\n      ```bash\n      pip install whl_path\n      ```\n    - \u7ec8\u7aef\u8f93\u5165 `msprechecker` \u6821\u9a8c\u662f\u5426\u5b89\u88c5\u6210\u529f\n\n# \u9884\u68c0\n## \u9884\u68c0\u5feb\u901f\u4f7f\u7528\n  - \u9ed8\u8ba4\u8fdb\u884c\u73af\u5883\u53d8\u91cf\u3001\u7cfb\u7edf\u914d\u7f6e\u7684\u6821\u9a8c\n    ```sh\n    msprechecker precheck\n    ```\n    \u968f\u540e\u4f1a\u5728\u7ec8\u7aef\u51fa\u73b0\u6253\u5370\u4fe1\u606f\uff0c\u5982\u679c\u6709\u73af\u5883\u53d8\u91cf\u7684\u68c0\u67e5\u9879\uff0c\u5219\u5728\u5f53\u524d\u76ee\u5f55\u4e0b\u751f\u6210\u914d\u7f6e\u5efa\u8bae\u73af\u5883\u53d8\u91cf\u7684 `msprechecker_env.sh` \u6587\u4ef6\n  - K8S \u90e8\u7f72\u65f6\u6307\u5b9a user_config.json \u68c0\u67e5\u548c mindie_env.json \u7684\u68c0\u67e5\n    ```sh\n    msprechecker precheck -user user_config.json --mindie_env_config_path mindie_env.json\n    ```\n  - \u53cc\u673a DS model \u68c0\u67e5\n    ```sh\n    msprechecker precheck -ch model --weight_dir <\u6743\u91cd\u8def\u5f84>\n    ```\n  - \u53cc\u673a DS hccl \u68c0\u67e5\n    ```sh\n    msprechecker precheck -ch hccl --ranktable <rank table \u8def\u5f84>\n    ```\n  - cpu \u548c npu \u538b\u6d4b\n    ```sh\n    msprechecker precheck -ch hardware\n    ```\n  - cpu \u548c npu \u538b\u6d4b\uff0c\u4ee5\u53ca\u591a\u673a\u7f51\u7edc\u8fde\u63a5\u72b6\u6001\u68c0\u67e5\n    ```sh\n    msprechecker precheck -ch hardware --ranktable <rank table \u8def\u5f84>\n    ```\n\n# \u843d\u76d8\u548c\u6bd4\u5bf9\n## \u843d\u76d8\u5feb\u901f\u4f7f\u7528\n  - \u63a8\u7406\u8fc7\u7a0b\u4e2d\uff0c\u5982\u679c\u51fa\u73b0 **\u5f02\u5e38** \u6216\u8005 \u200b**\u6027\u80fd\u4e0d\u53ca\u9884\u671f**\u200b\uff0c\u53ef\u4ee5\u4f7f\u7528 \u200b**\u843d\u76d8** \u529f\u80fd\u200b\uff0c\u5c06\u73af\u5883\u76f8\u5173\u4fe1\u606f\u8fdb\u884c\u843d\u76d8\uff0c\u65b9\u4fbf\u540e\u7eed\u6bd4\u5bf9\u3002\u63a8\u7406\u7ed3\u675f\u540e\uff0c\u6027\u80fd\u9884\u68c0\u5de5\u5177\u652f\u6301\u6bd4\u5bf9\u63a8\u7406\u4e2d\u843d\u76d8\u7684\u73af\u5883\u53d8\u91cf\u548c\u914d\u7f6e\u9879\uff0c\u5e2e\u52a9\u5feb\u901f\u53d1\u73b0\u53ef\u80fd\u5f71\u54cd\u6027\u80fd\u7684\u5dee\u5f02\u70b9\uff0c\u5b9e\u73b0\u95ee\u9898\u5feb\u901f\u5b9a\u4f4d\n  - \u4f7f\u7528\u843d\u76d8\u529f\u80fd\u53ea\u9700\u5728\u7ec8\u7aef\u4e2d\u8f93\u5165\n    ```bash\n    msprechecker dump -d abc\n    # msprechecker_logger - INFO - dump file saved to: abc\n    ```\n    \u5176\u4e2d `dump` \u8868\u660e\u6211\u4eec\u4f7f\u7528\u843d\u76d8\u529f\u80fd\u3002\u901a\u8fc7 `--dump_file_path` \u6216\u7f29\u5199 `-d` \u53c2\u6570\u6307\u5b9a\u81ea\u5b9a\u4e49\u843d\u76d8\u6587\u4ef6\u8def\u5f84\u3002\u8fd0\u884c\u7ed3\u675f\u540e\u4f1a\u5728\u5f53\u524d\u76ee\u5f55\u4e0b\u843d\u76d8\u73af\u5883\u53d8\u91cf\u4fe1\u606f\u6587\u4ef6 `abc`\n\n## \u843d\u76d8\u6587\u4ef6\u4ecb\u7ecd\n  - \u843d\u76d8\u6587\u4ef6\u5185\u5bb9\u7ed3\u6784\u5982\u4e0b\uff1a\n\n    ![image](./pics/dump_file_1.png)\n\n    - \u7b2c\u4e00\u5757\u4e3a MindIE \u670d\u52a1\u5316\u914d\u7f6e\uff0c\u5373\u5f53\u524d\u73af\u5883 MindIE \u670d\u52a1\u5316 config.json \u53c2\u6570\n    - \u7b2c\u4e8c\u5757\u4e3a\u73af\u5883\u53d8\u91cf\uff0c\u4e3a\u5f53\u524d\u7ec8\u7aef\u6240\u6709\u73af\u5883\u53d8\u91cf\u503c\n    - \u7b2c\u4e09\u5757\u4e3a\u7f51\u7edc\u914d\u7f6e\uff0c\u5305\u62ec HCCL \u8fde\u901a\u6821\u9a8c\u7684\u4fe1\u606f\n    - \u7b2c\u56db\u5757\u4e3a\u7cfb\u7edf\u914d\u7f6e\uff0c\u5305\u62ec\u7cfb\u7edf\u4fe1\u606f\u3001\u5185\u6838\u53d1\u884c\u7248\u3001CANN \u9a71\u52a8\u4fe1\u606f\u3001\u662f\u5426\u4e3a\u865a\u62df\u673a\u4ee5\u53ca\u662f\u5426\u5f00\u542f CPU \u9ad8\u6027\u80fd\n## \u6bd4\u5bf9\u5feb\u901f\u4f7f\u7528\n  - \u5728\u8fdb\u884c\u6bd4\u5bf9\u524d\uff0c\u8bf7\u786e\u4fdd\u4f7f\u7528\u9884\u68c0\u5de5\u5177\u843d\u76d8\u4e24\u4e2a\u6216\u591a\u4e2a\u6587\u4ef6\uff0c\u5355\u4e2a\u6587\u4ef6\u65e0\u6cd5\u6bd4\u5bf9\u3002\u4ee5\u4e0b\u793a\u4f8b\u5047\u8bbe\u5b58\u5728\u4e24\u4e2a\u843d\u76d8\u6587\u4ef6\uff0c\u8def\u5f84\u4e3a `path_a` \u548c `path_b`\uff0c\u5219\u60a8\u53ef\u4ee5\u4f7f\u7528\u5982\u4e0b\u547d\u4ee4\u8fdb\u884c\u6bd4\u5bf9\n    ```bash\n    msprechecker compare -d path_a path_b\n    ```\n    \u5176\u4e2d `compare` \u8868\u660e\u6211\u4eec\u4f7f\u7528\u6bd4\u5bf9\u529f\u80fd\uff0c`-d` \u4e3a\u53c2\u6570 `--dump_file_path` \u7684\u7f29\u5199\uff0c\u4e5f\u53ef\u4ee5\u4f7f\u7528 `--dump_file_path` \u8fdb\u884c\u6bd4\u5bf9\uff0c\u540e\u63a5\u4e24\u4e2a\u6216\u591a\u4e2a\u6587\u4ef6\u8def\u5f84\uff0c\u6027\u80fd\u9884\u68c0\u5de5\u5177\u4f1a\u4e00\u8d77\u6267\u884c\u6bd4\u5bf9\uff0c\u5c55\u793a\u5dee\u5f02\n## \u6bd4\u5bf9\u7ed3\u679c\u8bf4\u660e\n  - \u5982\u679c\u4e24\u4e2a\u6216\u591a\u4e2a\u843d\u76d8\u6587\u4ef6\u6ca1\u6709\u5dee\u5f02\uff0c\u5219\u4f1a\u5728\u7ec8\u7aef\u51fa\u73b0\u5982\u4e0b\u6253\u5370\u4fe1\u606f\uff1a\n    ```bash\n    msprechecker_logger - INFO - == compare start ==\n    msprechecker_logger - INFO - No difference found\n    msprechecker_logger - INFO - == compare end ==\n    ```\n  - \u5982\u679c\u4e24\u4e2a\u6216\u591a\u4e2a\u843d\u76d8\u6587\u4ef6\u5b58\u5728\u5dee\u5f02\uff0c\u5219\u4f1a\u5728\u7ec8\u7aef\u5c55\u793a\u5dee\u5f02\u9879\u3002\u6bd4\u5982\uff0c\u5c55\u793a\u5185\u5bb9\u4e3a\uff1a\n    ```bash\n    - key .Env.CPU_AFFINITY_CONF diffs\n      * b:\n        type<NoneType> : None\n      * c:\n        type<str> : 2\n      * d:\n        type<str> : 2\n      * e:\n        type<str> : 2\n    ```\n    \u8868\u660e\u73af\u5883\u53d8\u91cf `CPU_AFFINITY_CONF` \u5728\u56db\u4e2a\u6587\u4ef6 `b`, `c`, `d`, `e` \u4e2d\u5b58\u5728\u5dee\u5f02\u3002\u5176\u4e2d `b` \u6587\u4ef6\u4e2d\uff0c\u8be5\u73af\u5883\u53d8\u91cf\u7684\u503c\u4e3a `None`\uff0c\u5373\u6ca1\u6709\u8bbe\u7f6e\u8be5\u73af\u5883\u53d8\u91cf\uff1b\u800c `c`, `d`, `e` \u5747\u8bbe\u7f6e\u4e3a 2\n***\n\n# \u81ea\u5b9a\u4e49\u68c0\u67e5\u9879\u914d\u7f6e\n## \u81ea\u5b9a\u4e49\u68c0\u67e5\u9879\u914d\u7f6e\u4f7f\u7528\u8bf4\u660e\n\u5728\u8fdb\u884c precheck \u9884\u68c0\u65f6\uff0c\u652f\u6301\u81ea\u5b9a\u4e49\u914d\u7f6e\u6821\u9a8c\u9879\u3002\u76ee\u524d\u4ec5\u652f\u6301 `user_config.json` \u548c `mindie_env.json` \u7684\u914d\u7f6e\u6821\u9a8c\uff0c\u540e\u7eed\u5f00\u653e\u73af\u5883\u53d8\u91cf\u7684\u81ea\u5b9a\u4e49\u6821\u9a8c\u3002\n\u5047\u8bbe\u9700\u8981\u6821\u9a8c `a.b` \u7684\u503c\u662f\u5426\u7b26\u5408\u8981\u6c42\uff0c\u90a3\u4e48\u81ea\u5b9a\u4e49\u914d\u7f6e\u8bed\u6cd5\u5982\u4e0b\n```sh\na:\n  b:\n    expected:\n      type: eq\n      value: 1 + 2\n    reason: a.b \u7684\u503c\u5e94\u8be5\u7b49\u4e8e 3\n    severity: high\n```\n\u4e0a\u8ff0\u914d\u7f6e\u8868\u793a\uff0c`a.b` \u7684\u503c\u5e94\u8be5\u7b49\u4e8e 3\uff0c\u5176\u4e25\u91cd\u7a0b\u5ea6\u4e3a high\uff0c\u5982\u679c\u8be5\u5b57\u6bb5\u4e0d\u7b26\u5408\u9884\u671f\uff0c\u4f1a\u663e\u793a `[NOK]`\n\n\u76ee\u524d\uff0c\n- `type` \u652f\u6301\uff1a`eq`, `lt`, `le`, `gt`, `ge`, `ne` \u6216\u8005 `==`, `<`, `<=`, `>`, `>=`, `!=`\n- `value` \u652f\u6301\uff1a`+`, `-`, `*`, `/`, `//`, `**`, `()`\uff0c\u8fd8\u652f\u6301\u5b57\u6bb5\u5f15\u7528 `${}`, \u7248\u672c\u7b26\u53f7 `Version{}` \u4ee5\u53ca\u6743\u9650\u7b26\u53f7 `FilePerm{}`\n- `reason` \u652f\u6301\u4efb\u610f\u5b57\u7b26\u4e32\n- `severity` \u652f\u6301\uff1a`low`, `medium`, `high`\uff0c\u4e0d\u586b\u5199\u9ed8\u8ba4 `high`\u3002\u5176\u4e2d\uff0c`low` \u663e\u793a\u4e3a `[RECOMMEND]`\uff1b`medium` \u663e\u793a\u4e3a `[WARNING]`\uff1b`high` \u663e\u793a\u4e3a `[NOK]`\n\n### \u5b57\u6bb5\u5f15\u7528\n\u5bf9\u4e8e\u6bd4\u8f83\u5d4c\u5957\u8f83\u6df1\u7684\u914d\u7f6e\u6587\u4ef6\uff0c\u9047\u5230\u4e0d\u540c\u5b57\u6bb5\u76f8\u4e92\u5173\u8054\u7684\u573a\u666f\u65f6\uff0c\u521b\u5efa\u6821\u9a8c\u89c4\u5219\u662f\u4e00\u4e2a\u6311\u6218\u3002\u9884\u68c0\u5de5\u5177\u652f\u6301 **\u5b57\u6bb5\u5f15\u7528** \u8bed\u6cd5\uff0c\u5141\u8bb8\u7528\u6237\u901a\u8fc7 `${}` \u7684\u8bed\u6cd5\u6765\u5f15\u7528\u5176\u4ed6\u4f4d\u7f6e\u7684\u5b57\u6bb5\u503c\u3002\u6bd4\u5982\uff0c\u6709\u5982\u4e0b\u914d\u7f6e\u6587\u4ef6\n```json\n{\n  \"a\": {\n    \"b\": \"value of b\",\n    \"c\": \"value of c\"\n  }\n}\n```\n\u5982\u679c\u5e0c\u671b `a.b` \u7684\u503c\u548c `a.c` \u7684\u503c\u76f8\u7b49\uff0c\u5219\u6821\u9a8c\u89c4\u5219\u5982\u4e0b\uff1a\n```yaml\na:\n  b:\n    expected:\n      type: eq\n      value: ${.c}\n    reason: a.b \u7684\u503c\u7b49\u4e8e a.c\n    severity: high\n  c:\n  expected:\n      type: eq\n      value: ${a.b}\n    reason: a.c \u7684\u503c\u7b49\u4e8e a.b\n    severity: high\n```\n\u5176\u4e2d `${.c}` \u662f\u76f8\u5bf9\u5f15\u7528, `${a.b}` \u662f\u7edd\u5bf9\u5f15\u7528\uff1b\u5bf9\u4e8e\u5927\u578b\u5d4c\u5957\u7684\u914d\u7f6e\u6587\u4ef6\u5c24\u5176\u597d\u7528\u3002\n\n### \u7248\u672c\u5f15\u7528\n\u5982\u679c\u6821\u9a8c\u6d89\u53ca\u5230\u7248\u672c\u6bd4\u8f83\uff0c\u6bd4\u5982\u4f4e\u4e8e\u591a\u5c11\u7248\u672c\u65f6\u4f1a\u5bfc\u81f4\u6709\u95ee\u9898\uff0c\u53ef\u4ee5\u4f7f\u7528\u7248\u672c\u5f15\u7528\u3002\u6bd4\u5982 `transformers_version` \u7248\u672c\u9700\u8981\u5927\u4e8e `4.33`\uff0c\u5219\u53ef\u4ee5\u5199\u4e3a\n```yaml\ntransformers_version:\n  expected:\n    type: gt\n    value: Version{4.33}\n  reason: xx\n  severity: xx\n```\n\u5185\u7f6e\u4e86 `Version` \u7684\u6bd4\u8f83\u89c4\u5219\uff0c\u76ee\u524d\u662f `8.0.0 > 8.0.rc2 > 8.0.rc1 > 8.0.rc1.b020`\u3002\u5bf9\u4e8e T \u7248\u672c\u6682\u4e0d\u652f\u6301\u6821\u9a8c\uff0c\u56e0\u4e3a T \u7248\u672c\u6ca1\u6709\u89c4\u5f8b\n\n# \u53c2\u6570\u5217\u8868\n  - \u5b50\u529f\u80fd\u5305\u62ec `precheck` / `dump` / `compare`\n  - \u901a\u8fc7 `msprechecker -h` \u83b7\u53d6\u5b50\u529f\u80fd\u5217\u8868\uff0c\u4ee5\u53ca `msprechecker {\u5b50\u529f\u80fd} -h` \u83b7\u53d6\u5bf9\u5e94\u5b50\u529f\u80fd\u7684\u53c2\u6570\u5217\u8868\n## \u901a\u7528\u53c2\u6570\n<a id=\"1\"></a>\n\u4ee5\u4e0b\u901a\u7528\u53c2\u6570\u9002\u7528\u4e8e `msprechecker precheck` \u548c `msprechecker dump`\uff0c\u4e0d\u9002\u7528\u4e8e `msprechecker compare`\n  | \u53c2\u6570\u540d                          | \u53c2\u6570\u63cf\u8ff0                                                                                        | \u662f\u5426\u5fc5\u9009                                    |\n  | ------------------------------- | ----------------------------------------------------------------------------------------------- | ------------------------------------------- |\n  | -ch {...}, --checkers {...}     | *\u5b57\u7b26\u4e32\u5217\u8868\u503c\uff0c\u53ef\u9009\u503c basic,hccl,model,hardware,all\uff0c\u6307\u5b9a\u68c0\u67e5\u9879\uff0c\u53ef\u6307\u5b9a\u591a\u4e2a\uff0call \u8868\u793a\u5168\u90e8        | \u5426\uff0c\u9ed8\u8ba4\u503c basic                            |\n  | -service, --service_config_path | \u5b57\u7b26\u4e32\u503c\uff0cMINDIE service \u8def\u5f84\u6216 config json \u6587\u4ef6\u8def\u5f84\uff0c\u4f18\u5148\u7ea7\u9ad8\u4e8e\u73af\u5883\u53d8\u91cf\u7684 MIES_INSTALL_PATH \u503c | \u5426\uff0c\u9ed8\u8ba4\u4f7f\u7528\u73af\u5883\u53d8\u91cf\u7684 MIES_INSTALL_PATH \u503c |\n  | -user, --user_config_path       | \u5b57\u7b26\u4e32\u503c\uff0cjson \u6587\u4ef6\uff0ck8s user_config.json \u6587\u4ef6\uff0c\u4e0d\u6307\u5b9a\u5219\u4e0d\u68c0\u67e5                                    | \u5426\uff0c\u9ed8\u8ba4 None                               |\n  | --mindie_env_config_path        | \u5b57\u7b26\u4e32\u503c\uff0cjson \u6587\u4ef6\uff0ck8s mindie_env.json \u6587\u4ef6\uff0c\u4e0d\u6307\u5b9a\u5219\u4e0d\u68c0\u67e5                                     | \u5426\uff0c\u9ed8\u8ba4 None                               |\n  | -ranktable, --ranktable_file    | \u5b57\u7b26\u4e32\u503c\uff0cjson \u6587\u4ef6\uff0c\u624b\u52a8\u6307\u5b9a ranktable \u6587\u4ef6\uff0c\u4f18\u5148\u7ea7\u9ad8\u4e8e\u73af\u5883\u53d8\u91cf\u7684 RANKFILETABLE                | \u5426\uff0c\u9ed8\u8ba4\u4f7f\u7528\u73af\u5883\u53d8\u91cf\u7684 RANKFILETABLE \u503c     |\n  | --weight_dir   |  \u6a21\u578b\u6743\u91cd\u76ee\u5f55\u8def\u5f84        | \u5426\uff0c\u9ed8\u8ba4\u4f7f\u7528 config.json \u4e2d\u7684 `modelWeightPath` \u5b57\u6bb5\u8def\u5f84   |\n  | -blocknum, --sha256_blocknum    | int \u503c\uff0c\u8ba1\u7b97\u6a21\u578b\u6743\u91cd sha256sum \u503c\u65f6\u7684\u91c7\u6837\u5757\u6570\uff0c\u503c\u8d8a\u5927\u91c7\u6837\u8d8a\u591a\uff0c\u8ba1\u7b97\u901f\u5ea6\u8d8a\u6162                     | \u5426\uff0c\u9ed8\u8ba4 1000                               |\n  | -add, --additional_checks_yaml  | \u5b57\u7b26\u4e32\u503c\uff0cyaml \u6587\u4ef6\uff0c\u989d\u5916\u7684\u81ea\u5b9a\u4e49\u914d\u7f6e\u9879\uff0c\u6307\u5b9a\u540e\u5c06\u8986\u76d6\u9ed8\u8ba4\u68c0\u67e5\u9879\u4e2d\u7684\u503c                           | \u5426\uff0c\u9ed8\u8ba4 None                               |\n  | -l {...}, --log_level {...}     | \u65e5\u5fd7\u7ea7\u522b\uff0c\u53ef\u9009\u503c debug,info,warning,error,fatal,critical                                        | \u5426\uff0c\u9ed8\u8ba4 info                               |\n\n  - `basic` \u8868\u793a\u68c0\u67e5\u73af\u5883\u53d8\u91cf\u4ee5\u53ca\u57fa\u672c\u7cfb\u7edf\u4fe1\u606f\n  - `hccl` \u8868\u793a\u68c0\u67e5 NPU \u4e4b\u95f4\u901a\u8fc7 hccl \u8fde\u63a5\u7684\u72b6\u6001\n  - `model` \u8868\u793a\u68c0\u67e5\u6216\u6bd4\u5bf9\u6a21\u578b\u5927\u5c0f\u4ee5\u53ca sha256sum \u503c\n  - `hardware` \u8868\u793a\u68c0\u67e5 CPU / NPU \u8ba1\u7b97\u80fd\u529b\uff0c\u4ee5\u53ca\u7f51\u7edc\u8fde\u63a5\u72b6\u6001\n  - `all` \u8868\u793a\u68c0\u67e5\u5168\u90e8\n## precheck \u989d\u5916\u53c2\u6570\n  | \u53c2\u6570\u540d         | \u53c2\u6570\u63cf\u8ff0                                             | \u662f\u5426\u5fc5\u9009                       |\n  | -------------- | ---------------------------------------------------- | ------------------------------ |\n  | -s, --save_env | \u5b57\u7b26\u4e32\u503c\uff0c\u6307\u5b9a\u73af\u5883\u53d8\u91cf\u9700\u8981\u4f18\u5316\u65f6\uff0c\u8f93\u51fa\u7684 sh \u6587\u4ef6\u8def\u5f84 | \u5426\uff0c\u9ed8\u8ba4\u4e3a msprechecker_env.sh |\n## dump \u989d\u5916\u53c2\u6570\n  | \u53c2\u6570\u540d               | \u53c2\u6570\u63cf\u8ff0                           | \u662f\u5426\u5fc5\u9009                                            |\n  | -------------------- | ---------------------------------- | --------------------------------------------------- |\n  | -d, --dump_file_path | \u5b57\u7b26\u4e32\u503c\uff0c\u6307\u5b9a dump \u6570\u636e\u7684\u4fdd\u5b58\u8def\u5f84 | \u5426\uff0c\u9ed8\u8ba4\u4e3a /tmp/msprechecker_dump_{time_stamp}.json |\n## compare \u53c2\u6570\n  | \u53c2\u6570\u540d                      | \u53c2\u6570\u63cf\u8ff0                                                 | \u662f\u5426\u5fc5\u9009       |\n  | --------------------------- | -------------------------------------------------------- | -------------- |\n  | dump_file_paths             | **\u4f4d\u7f6e\u53c2\u6570**\uff0c\u5b57\u7b26\u4e32\u5217\u8868\u503c\uff0c\u6307\u5b9a dump \u7684\u591a\u4efd\u6570\u636e         | \u662f\uff0c\u4e14\u5e94\u4e3a\u591a\u4e2a |\n  | -l {...}, --log_level {...} | \u65e5\u5fd7\u7ea7\u522b\uff0c\u53ef\u9009\u503c debug,info,warning,error,fatal,critical | \u5426\uff0c\u9ed8\u8ba4 info  |\n",
    "bugtrack_url": null,
    "license": "Apache-2.0",
    "summary": "MindStudio Prechecker",
    "version": "0.1.0",
    "project_urls": {
        "documentation": "https://gitee.com/ascend/msit/tree/master/msprechecker",
        "source": "https://gitee.com/ascend/msit/tree/master/msprechecker",
        "tracker": "https://gitee.com/ascend/msit/issues"
    },
    "split_keywords": [
        "ms",
        " prechecker"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "db1a930fb7bde1f7569bdbda8cfbfb067a1c050306dbf03c33be1b4c7ed3da67",
                "md5": "bb5d642cdc69d67883721b10e73a1127",
                "sha256": "0fc1ee3eb3606fb1d0b2357f3e039b5658c9962b9046bcd88d45f97729cee6ae"
            },
            "downloads": -1,
            "filename": "msprechecker-0.1.0-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "bb5d642cdc69d67883721b10e73a1127",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.7",
            "size": 105552,
            "upload_time": "2025-08-08T07:44:19",
            "upload_time_iso_8601": "2025-08-08T07:44:19.181043Z",
            "url": "https://files.pythonhosted.org/packages/db/1a/930fb7bde1f7569bdbda8cfbfb067a1c050306dbf03c33be1b4c7ed3da67/msprechecker-0.1.0-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "617501bc916e91e596f6b3177585278ce30cfaafaa0354f892549520f65d0eea",
                "md5": "2d3a95e1510e54e1f4901ad6c37a7d1c",
                "sha256": "32eb961eedc20d39110b7ec2ea8435896f730e64501da7589a60d0f9832d7b4e"
            },
            "downloads": -1,
            "filename": "msprechecker-0.1.0.tar.gz",
            "has_sig": false,
            "md5_digest": "2d3a95e1510e54e1f4901ad6c37a7d1c",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.7",
            "size": 62918,
            "upload_time": "2025-08-08T07:44:20",
            "upload_time_iso_8601": "2025-08-08T07:44:20.767817Z",
            "url": "https://files.pythonhosted.org/packages/61/75/01bc916e91e596f6b3177585278ce30cfaafaa0354f892549520f65d0eea/msprechecker-0.1.0.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-08-08 07:44:20",
    "github": false,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "lcname": "msprechecker"
}
        
Elapsed time: 2.07339s