inoyb


Nameinoyb JSON
Version 1.1.1 PyPI version JSON
download
home_pagehttps://github.com/ldichen/It-is-none-of-your-business
Summary极其友好的地理空间AI模型服务框架 - Docker化部署,支持Gradio界面
upload_time2025-08-07 09:52:20
maintainerNone
docs_urlNone
authorDiChen
requires_python>=3.8
licenseMIT
keywords gradio model service framework ml ai docker geospatial rasterio gdal opengms
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # inoyb

**inoyb** - 基于mc.json配置的Gradio模型服务框架

## 简介

inoyb是一个轻量级的Python框架,用于快速构建基于Gradio的机器学习模型服务。通过简单的配置文件和装饰器,您可以轻松地将模型推理代码转换为Web服务。

## 特性

- 🚀 **一键部署**: 使用`@your_turn()`装饰器即可将模型函数转换为Web服务
- 📋 **配置驱动**: 通过mc.json配置文件定义输入输出界面
- 🔧 **智能执行**: 支持隔离工作空间和并发执行
- 📁 **文件管理**: 智能大文件检测和符号链接优化
- 🎨 **美观界面**: 基于Gradio构建的现代化Web界面
- 📊 **预览支持**: 自动生成地理数据预览图
- 🗂️ **文件夹浏览**: 支持文件夹输出的在线浏览

## 快速开始

### 安装

```bash
pip install inoyb
```

### 基本使用

1. 创建模型服务文件 `gogogo.py`:

```python
from inoyb import your_turn

@your_turn()
def model_handler(*inputs):
    return [
        "python", "model/inference.py",
        "--data_files", inputs[0], inputs[1], inputs[2],
        "--config_path", "model/config.json",
        "--checkpoint", "model/Prithvi_EO_V1_100M.pt"
    ]

if __name__ == "__main__":
    model_handler.run()
```

2. 创建配置文件 `mc.json`:

```json
{
  "model_info": {
    "name": "Prithvi地理空间基础模型",
    "description": "基于卫星图像的地理空间分析模型",
    "version": "1.0.0"
  },
  "inputs": {
    "hls_data": {
      "type": "geodata",
      "label": "HLS数据文件",
      "required": true,
      "file_types": [".tif", ".tiff"]
    },
    "mask_data": {
      "type": "geodata", 
      "label": "掩码数据文件",
      "required": true,
      "file_types": [".tif", ".tiff"]
    }
  },
  "outputs": {
    "prediction": {
      "type": "geodata",
      "label": "预测结果",
      "required": true,
      "file_types": [".tif"],
      "bands": [3, 2, 1]
    }
  }
}
```

3. 运行服务:

```bash
python gogogo.py
```

### 装饰器参数

- `mc_json`: 配置文件路径 (默认: "mc.json")
- `port`: 服务端口 (默认: 从环境变量读取)
- `example_path`: 示例数据路径 (默认: "examples")
- `output_dir`: 输出目录 (默认: "outputs")

### 项目结构

```
your-project/
├── gogogo.py          # 模型服务启动文件
├── mc.json           # 配置文件
├── model/            # 模型文件夹
│   ├── inference.py  # 模型推理脚本
│   ├── config.json   # 模型配置
│   └── weights.pt    # 模型权重
├── examples/         # 示例数据(可选)
└── outputs/          # 输出目录
```

## 配置说明

### mc.json结构

- `model_info`: 模型基本信息
- `inputs`: 输入字段定义
- `outputs`: 输出字段定义

### 支持的数据类型

- `geodata`: 地理空间数据(.tif, .tiff等)
- `file`: 普通文件
- `folder`: 文件夹
- `text`: 文本输入

## 高级特性

### 大文件优化

框架自动检测大文件(>200MB)并使用符号链接优化存储空间,避免不必要的文件复制。

### 并发支持

支持多用户并发访问,每个请求在独立的工作空间中执行,互不干扰。

### 预览生成

对于地理数据输出,自动生成预览图片,支持自定义波段组合。

## 开发

### 安装开发依赖

```bash
pip install -e ".[dev]"
```

### 运行测试

```bash
pytest
```

### 代码格式化

```bash
black inoyb/
```

## 许可证

MIT License

## 贡献

欢迎提交Issue和Pull Request!

## 作者

DiChen - dichen@example.com

            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/ldichen/It-is-none-of-your-business",
    "name": "inoyb",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.8",
    "maintainer_email": null,
    "keywords": "gradio, model, service, framework, ml, ai, docker, geospatial, rasterio, gdal, openGMS",
    "author": "DiChen",
    "author_email": "DiChen <ldicccccc@gmail.com>",
    "download_url": null,
    "platform": null,
    "description": "# inoyb\n\n**inoyb** - \u57fa\u4e8emc.json\u914d\u7f6e\u7684Gradio\u6a21\u578b\u670d\u52a1\u6846\u67b6\n\n## \u7b80\u4ecb\n\ninoyb\u662f\u4e00\u4e2a\u8f7b\u91cf\u7ea7\u7684Python\u6846\u67b6\uff0c\u7528\u4e8e\u5feb\u901f\u6784\u5efa\u57fa\u4e8eGradio\u7684\u673a\u5668\u5b66\u4e60\u6a21\u578b\u670d\u52a1\u3002\u901a\u8fc7\u7b80\u5355\u7684\u914d\u7f6e\u6587\u4ef6\u548c\u88c5\u9970\u5668\uff0c\u60a8\u53ef\u4ee5\u8f7b\u677e\u5730\u5c06\u6a21\u578b\u63a8\u7406\u4ee3\u7801\u8f6c\u6362\u4e3aWeb\u670d\u52a1\u3002\n\n## \u7279\u6027\n\n- \ud83d\ude80 **\u4e00\u952e\u90e8\u7f72**: \u4f7f\u7528`@your_turn()`\u88c5\u9970\u5668\u5373\u53ef\u5c06\u6a21\u578b\u51fd\u6570\u8f6c\u6362\u4e3aWeb\u670d\u52a1\n- \ud83d\udccb **\u914d\u7f6e\u9a71\u52a8**: \u901a\u8fc7mc.json\u914d\u7f6e\u6587\u4ef6\u5b9a\u4e49\u8f93\u5165\u8f93\u51fa\u754c\u9762\n- \ud83d\udd27 **\u667a\u80fd\u6267\u884c**: \u652f\u6301\u9694\u79bb\u5de5\u4f5c\u7a7a\u95f4\u548c\u5e76\u53d1\u6267\u884c\n- \ud83d\udcc1 **\u6587\u4ef6\u7ba1\u7406**: \u667a\u80fd\u5927\u6587\u4ef6\u68c0\u6d4b\u548c\u7b26\u53f7\u94fe\u63a5\u4f18\u5316\n- \ud83c\udfa8 **\u7f8e\u89c2\u754c\u9762**: \u57fa\u4e8eGradio\u6784\u5efa\u7684\u73b0\u4ee3\u5316Web\u754c\u9762\n- \ud83d\udcca **\u9884\u89c8\u652f\u6301**: \u81ea\u52a8\u751f\u6210\u5730\u7406\u6570\u636e\u9884\u89c8\u56fe\n- \ud83d\uddc2\ufe0f **\u6587\u4ef6\u5939\u6d4f\u89c8**: \u652f\u6301\u6587\u4ef6\u5939\u8f93\u51fa\u7684\u5728\u7ebf\u6d4f\u89c8\n\n## \u5feb\u901f\u5f00\u59cb\n\n### \u5b89\u88c5\n\n```bash\npip install inoyb\n```\n\n### \u57fa\u672c\u4f7f\u7528\n\n1. \u521b\u5efa\u6a21\u578b\u670d\u52a1\u6587\u4ef6 `gogogo.py`:\n\n```python\nfrom inoyb import your_turn\n\n@your_turn()\ndef model_handler(*inputs):\n    return [\n        \"python\", \"model/inference.py\",\n        \"--data_files\", inputs[0], inputs[1], inputs[2],\n        \"--config_path\", \"model/config.json\",\n        \"--checkpoint\", \"model/Prithvi_EO_V1_100M.pt\"\n    ]\n\nif __name__ == \"__main__\":\n    model_handler.run()\n```\n\n2. \u521b\u5efa\u914d\u7f6e\u6587\u4ef6 `mc.json`:\n\n```json\n{\n  \"model_info\": {\n    \"name\": \"Prithvi\u5730\u7406\u7a7a\u95f4\u57fa\u7840\u6a21\u578b\",\n    \"description\": \"\u57fa\u4e8e\u536b\u661f\u56fe\u50cf\u7684\u5730\u7406\u7a7a\u95f4\u5206\u6790\u6a21\u578b\",\n    \"version\": \"1.0.0\"\n  },\n  \"inputs\": {\n    \"hls_data\": {\n      \"type\": \"geodata\",\n      \"label\": \"HLS\u6570\u636e\u6587\u4ef6\",\n      \"required\": true,\n      \"file_types\": [\".tif\", \".tiff\"]\n    },\n    \"mask_data\": {\n      \"type\": \"geodata\", \n      \"label\": \"\u63a9\u7801\u6570\u636e\u6587\u4ef6\",\n      \"required\": true,\n      \"file_types\": [\".tif\", \".tiff\"]\n    }\n  },\n  \"outputs\": {\n    \"prediction\": {\n      \"type\": \"geodata\",\n      \"label\": \"\u9884\u6d4b\u7ed3\u679c\",\n      \"required\": true,\n      \"file_types\": [\".tif\"],\n      \"bands\": [3, 2, 1]\n    }\n  }\n}\n```\n\n3. \u8fd0\u884c\u670d\u52a1:\n\n```bash\npython gogogo.py\n```\n\n### \u88c5\u9970\u5668\u53c2\u6570\n\n- `mc_json`: \u914d\u7f6e\u6587\u4ef6\u8def\u5f84 (\u9ed8\u8ba4: \"mc.json\")\n- `port`: \u670d\u52a1\u7aef\u53e3 (\u9ed8\u8ba4: \u4ece\u73af\u5883\u53d8\u91cf\u8bfb\u53d6)\n- `example_path`: \u793a\u4f8b\u6570\u636e\u8def\u5f84 (\u9ed8\u8ba4: \"examples\")\n- `output_dir`: \u8f93\u51fa\u76ee\u5f55 (\u9ed8\u8ba4: \"outputs\")\n\n### \u9879\u76ee\u7ed3\u6784\n\n```\nyour-project/\n\u251c\u2500\u2500 gogogo.py          # \u6a21\u578b\u670d\u52a1\u542f\u52a8\u6587\u4ef6\n\u251c\u2500\u2500 mc.json           # \u914d\u7f6e\u6587\u4ef6\n\u251c\u2500\u2500 model/            # \u6a21\u578b\u6587\u4ef6\u5939\n\u2502   \u251c\u2500\u2500 inference.py  # \u6a21\u578b\u63a8\u7406\u811a\u672c\n\u2502   \u251c\u2500\u2500 config.json   # \u6a21\u578b\u914d\u7f6e\n\u2502   \u2514\u2500\u2500 weights.pt    # \u6a21\u578b\u6743\u91cd\n\u251c\u2500\u2500 examples/         # \u793a\u4f8b\u6570\u636e(\u53ef\u9009)\n\u2514\u2500\u2500 outputs/          # \u8f93\u51fa\u76ee\u5f55\n```\n\n## \u914d\u7f6e\u8bf4\u660e\n\n### mc.json\u7ed3\u6784\n\n- `model_info`: \u6a21\u578b\u57fa\u672c\u4fe1\u606f\n- `inputs`: \u8f93\u5165\u5b57\u6bb5\u5b9a\u4e49\n- `outputs`: \u8f93\u51fa\u5b57\u6bb5\u5b9a\u4e49\n\n### \u652f\u6301\u7684\u6570\u636e\u7c7b\u578b\n\n- `geodata`: \u5730\u7406\u7a7a\u95f4\u6570\u636e(.tif, .tiff\u7b49)\n- `file`: \u666e\u901a\u6587\u4ef6\n- `folder`: \u6587\u4ef6\u5939\n- `text`: \u6587\u672c\u8f93\u5165\n\n## \u9ad8\u7ea7\u7279\u6027\n\n### \u5927\u6587\u4ef6\u4f18\u5316\n\n\u6846\u67b6\u81ea\u52a8\u68c0\u6d4b\u5927\u6587\u4ef6(>200MB)\u5e76\u4f7f\u7528\u7b26\u53f7\u94fe\u63a5\u4f18\u5316\u5b58\u50a8\u7a7a\u95f4\uff0c\u907f\u514d\u4e0d\u5fc5\u8981\u7684\u6587\u4ef6\u590d\u5236\u3002\n\n### \u5e76\u53d1\u652f\u6301\n\n\u652f\u6301\u591a\u7528\u6237\u5e76\u53d1\u8bbf\u95ee\uff0c\u6bcf\u4e2a\u8bf7\u6c42\u5728\u72ec\u7acb\u7684\u5de5\u4f5c\u7a7a\u95f4\u4e2d\u6267\u884c\uff0c\u4e92\u4e0d\u5e72\u6270\u3002\n\n### \u9884\u89c8\u751f\u6210\n\n\u5bf9\u4e8e\u5730\u7406\u6570\u636e\u8f93\u51fa\uff0c\u81ea\u52a8\u751f\u6210\u9884\u89c8\u56fe\u7247\uff0c\u652f\u6301\u81ea\u5b9a\u4e49\u6ce2\u6bb5\u7ec4\u5408\u3002\n\n## \u5f00\u53d1\n\n### \u5b89\u88c5\u5f00\u53d1\u4f9d\u8d56\n\n```bash\npip install -e \".[dev]\"\n```\n\n### \u8fd0\u884c\u6d4b\u8bd5\n\n```bash\npytest\n```\n\n### \u4ee3\u7801\u683c\u5f0f\u5316\n\n```bash\nblack inoyb/\n```\n\n## \u8bb8\u53ef\u8bc1\n\nMIT License\n\n## \u8d21\u732e\n\n\u6b22\u8fce\u63d0\u4ea4Issue\u548cPull Request\uff01\n\n## \u4f5c\u8005\n\nDiChen - dichen@example.com\n",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "\u6781\u5176\u53cb\u597d\u7684\u5730\u7406\u7a7a\u95f4AI\u6a21\u578b\u670d\u52a1\u6846\u67b6 - Docker\u5316\u90e8\u7f72\uff0c\u652f\u6301Gradio\u754c\u9762",
    "version": "1.1.1",
    "project_urls": {
        "Bug Reports": "https://github.com/ldichen/It-is-none-of-your-business/issues",
        "Changelog": "https://github.com/ldichen/It-is-none-of-your-business/releases",
        "Documentation": "https://github.com/ldichen/It-is-none-of-your-business#readme",
        "Homepage": "https://github.com/ldichen/It-is-none-of-your-business",
        "Repository": "https://github.com/ldichen/It-is-none-of-your-business"
    },
    "split_keywords": [
        "gradio",
        " model",
        " service",
        " framework",
        " ml",
        " ai",
        " docker",
        " geospatial",
        " rasterio",
        " gdal",
        " opengms"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "396f815d6e87364dd503cfbbd495fcb7814cc35e3a19b6c9a178403bd6125321",
                "md5": "b1bb80e5bd598a16ce4de72976b01d3e",
                "sha256": "28016a0ab7f9165b7d84920523c44d3c6b82a47282209d4c7f893a9a16ca80e0"
            },
            "downloads": -1,
            "filename": "inoyb-1.1.1-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "b1bb80e5bd598a16ce4de72976b01d3e",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.8",
            "size": 65132,
            "upload_time": "2025-08-07T09:52:20",
            "upload_time_iso_8601": "2025-08-07T09:52:20.873755Z",
            "url": "https://files.pythonhosted.org/packages/39/6f/815d6e87364dd503cfbbd495fcb7814cc35e3a19b6c9a178403bd6125321/inoyb-1.1.1-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-08-07 09:52:20",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "ldichen",
    "github_project": "It-is-none-of-your-business",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": false,
    "lcname": "inoyb"
}
        
Elapsed time: 0.43970s