模块设置文件
模块的安装、启动和管理方式在该模块的 modulesettings.json 文件(或文件)中定义。您可以为每个需要支持的设备、操作系统、架构或 GPU 组合创建一个单独的 modulesettings 文件。更多信息,请参阅 模块设置。
假设我们将模块标记为DemoModulePython,则设置文件的基本格式如下:
JSON
{
"Modules": {
"DemoModulePython": {
"Name": "My module name",
"Version": "2.0.0",
"PublishingInfo" : {
...
},
"LaunchSettings": {
...
},
"EnvironmentVariables": {
...
},
"GpuOptions" : {
...
},
"InstallOptions" : {
...
},
"UIElements" : {
...
},
"RouteMaps": [
{
...
}]
}
}
}
让我们逐步完成此过程并填写值。
名称和版本应该是不言自明的,模块 ID 是您希望提供的任何 ID,只要不与其他模块冲突即可。我们将模块标记为 DemoModulePython。
我们的发布信息部分将包含:
JSON
"PublishingInfo" : {
"Description" : "Provides Object Detection YOLOv8",
"Category" : "Computer Vision",
"Stack" : "Python, PyTorch, YOLO",
"License" : "AGPL-3.0",
"LicenseUrl" : "https://gnu.ac.cn/licenses/agpl-3.0.en.html",
"Author" : "Chris Maunder",
"Homepage" : "https://codeproject.com/ai",
"BasedOn" : "ultralytics", // What project is this based on?
"BasedOnUrl" : "https://github.com/ultralytics/ultralytics" // The URL for that project
}
启动设置将包含:
JSON
"LaunchSettings": {
"AutoStart" : true, // Start this when the server starts
"FilePath" : "detect_adapter.py", // Name of file that gets launched
"Runtime" : "python3.8", // file is launched by Python
"RuntimeLocation" : "Local", // We want our own virt. env., not a shared one
"PostStartPauseSecs" : 1, // Generally 1 if using GPU, 0 for CPU
"Queue" : "objdetect_queue", // Can be left as null if you wish
"Parallelism" : 0 // 0 = Default (number of CPUs - 1)
}
- 文件路径和运行时是这里最重要的字段。如果需要,其他所有字段都可以省略。
- 队列指定服务器将客户端请求放置的位置,以及模块将查找请求以进行处理的队列名称。您可以将其留空,或者如果希望多个模块服务同一队列,则可以提供名称。
- 并行度表示将运行以服务此队列的并行任务数。
- RuntimeLocation 目前仅用于 Python,可以是“shared”(共享),这意味着此模块将使用共享虚拟环境来节省空间,或者“local”(本地),这意味着 venv 将是此模块的本地环境(以避免包冲突)。
环境变量部分包含我们希望在启动前设置的任何环境变量。
JSON
"EnvironmentVariables": {
"MODEL_SIZE" : "Medium", // tiny, small, medium, large
"MODELS_DIR" : "%CURRENT_MODULE_PATH%/assets"
}
请注意CURRENT_MODULE_PATH
宏的使用。更多信息,请参阅 宏。
GpuOptions仅用于 GPU 设置。
JSON
"GpuOptions": {
"InstallGPU" : true, // Should we install GPU enabled code?
"EnableGPU" : true, // Should we enable GPU support (if installed)
"AcceleratorDeviceName" : null, // eg "cuda:0" or just leave blank for default
"HalfPrecision" : "enable" // For code that supports half-precision. Use 'Force', 'Enable', 'Disable'
}
- HalfPrecision允许您在不支持半精度运算的旧版 CUDA 卡上禁用半精度运算。通常可以省略此项,因为 CodeProject.AI 服务器可以为您做出一些合理的推测。
安装选项描述了模块如何、在何处以及是否应该或可以安装。
JSON
"InstallOptions": {
"Platforms": [ "windows", "linux" ],
"ModuleReleases": [
{ "ModuleVersion": "1.0.0", "ServerVersionRange": [ "1.0.0", "2.4.9" ],
"ReleaseDate": "2023-01-01", "ReleaseNotes": "Initial Release",
"Importance": "Major" },
{ "ModuleVersion": "2.0.0", "ServerVersionRange": [ "2.5.0", "" ],
"ReleaseDate": "2023-02-14", "ReleaseNotes": "Updated for Server 2.5.0",
"Importance": "Major" }
]
}
- 平台是一个平台列表。支持的选项包括:windows、macos、linux、raspberrypi、orangepi、jetson,以及 arm64 变体:windows-arm64、macos-arm64、linux-arm64。或者,使用“all”表示它可以在任何地方运行。
- 模块版本是一个版本数组以及它兼容的服务器版本。在本例中,版本 1 兼容 CodeProject.AI 服务器版本 1 到 2.4.9,模块的版本 2 兼容 CodeProject.AI 版本 2.5 及更高版本。
UIElements为服务器提供有关 UI 选项的信息。我们只讨论仪表板中模块行上出现的上下文菜单。我们将提供一个提供模型大小的菜单。
JSON
添加第二个菜单选项就像添加另一个菜单对象("UIElements" : {
"Menus": [{
"Label": "Half Precision",
"Options": [
{ "Label": "Force on", "Setting": "CPAI_HALF_PRECISION", "Value": "force" },
{ "Label": "Use Default", "Setting": "CPAI_HALF_PRECISION", "Value": "enable" },
{ "Label": "Disable", "Setting": "CPAI_HALF_PRECISION", "Value": "disable" }
]
}]
},
{ "Label": .... "Options": ...}
)一样简单。
路由映射定义模块的 API 路由。
JSON
"RouteMaps": [{
"Name": "Python YOLOv8 Object Detector",
"Route": "vision/detection",
"Method": "POST",
"Command": "detect",
"Description": "Detects objects",
"Inputs": [
{
"Name": "image",
"Type": "File",
"Description": "The HTTP file object (image) to be analyzed."
},
{
"Name": "min_confidence",
"Type": "Float",
"Description": "The minimum confidence level (0.0 - 1.0) for an object will be detected.",
"DefaultValue": 0.4,
"MinValue": 0.0,
"MaxValue": 1.0
}],
"Outputs": [{
"Name": "success",
"Type": "Boolean",
"Description": "True if successful."
},
...
]
}
]
- 路由是调用者将用于调用此模块的路由。vision/detection 路由将对应于 API 调用 https://:32168/v1/vision/detection。
- 命令是将发送到此路由的命令。您可以设置指向同一路径但发送不同命令的路由。由您的模块负责适当地处理命令。
- 输入和输出定义输入参数和输出结果,并用于自动记录您的模块。
添加变体模块设置文件
假设您希望在模块在 Windows 上运行时提供不同的设置。例如,您可能希望对 Windows 使用 Python 3.9。只需创建一个 modulesettings 的变体,其文件名确保仅在 Windows 上选择它(有关信息,请参阅 模块设置文件)。在这种情况下,modulesettings.windows.json
将适用于一般的 Windows 安装,我们只需要覆盖我们希望更改的值。