当前位置: 首页 > ds >正文

nuclio

前面介绍了CVAT的结构,其中nuclio不太懂,在此介绍一下,cvat相关的介绍请看CVAT标注服务-CSDN博客

什么是 Nuclio?

Nuclio 是一个高性能的 “无服务器”(Serverless)函数平台。你可以把它想象成一个专门用来运行一小段一小段代码(也就是“函数”)的强大引擎。它最大的特点是

与传统的需要一直运行的服务器不同,无服务器平台只在需要时才执行你的代码,并且能自动扩展以应对高并发请求。这让你只需专注于编写核心业务逻辑,而不用操心服务器的部署、维护和扩缩容等繁琐事务。

核心优势:

  • 极致性能:Nuclio 的设计目标就是快。它能以接近本机代码的速度处理事件和执行函数,延迟极低(通常在毫秒级以内),非常适合需要快速响应的应用。
  • 多语言支持:支持多种主流编程语言,如 Go, Python, Node.js, Java, .NET Core 等。
  • 开放且灵活:它可以部署在任何地方,无论是云端的 Kubernetes 集群、笔记本电脑上的 Docker,还是边缘设备上。它不与特定的云厂商绑定。
  • 集成多种事件源:函数可以由各种事件触发,例如 HTTP 请求、消息队列(如 Kafka, RabbitMQ)、定时任务 (Cron Job) 等。

简单来说,Nucl_io 就像一个代码的“超级执行器”,你把代码扔给它,它就能以极高的效率和弹性去运行。

什么是 nuctl

nuctlNuclio 的官方命令行界面(CLI)工具,用于部署、管理和调试无服务器函数。它是你与 Nuclio 平台交互的主要方式,就像 git 命令是你与 GitHub 交互的工具一样。

通过 nuctl,你可以在命令行中完成几乎所有关于函数的管理操作,比如创建、部署、管理和监控你的无服务器函数。这对于自动化部署流程(CI/CD)和开发者日常管理来说非常方便。

nuctl安装

在 Ubuntu 上最常用和推荐的安装方法是直接从 Nuclio 的 GitHub 发布页面下载预编译的二进制文件。这种方法简单、直接,并且能确保您使用的是最新版本。

第一步:下载 nuctl 二进制文件

您需要从 Nuclio 的官方 GitHub Releases 页面找到最新的 Linux 版本。

  1. 访问发布页面: Releases · nuclio/nuclio · GitHub

  2. 在最新版本的 "Assets"(资产)部分,找到适用于 Linux 的文件。文件名通常遵循以下格式:nuctl-<版本号>-linux-amd64

  3. 复制该文件的链接地址,然后使用 curlwget 命令下载。这里我们使用 curl 作为示例。

命令示例 (请注意设置版本号 ):

curl -Lo nuctl https://github.com/nuclio/nuclio/releases/download/1.12.8/nuctl-1.12.8-linux-amd64

命令解释:

  • curl: 一个强大的命令行工具,用于通过 URL 传输数据(在这里是下载文件)。
  • -Lo nuctl: 这是两个参数的组合:
    • -L (Location): 告诉 curl 跟随重定向。GitHub 通常会使用重定向来提供下载链接,所以这个参数很重要。
    • -o nuctl (Output): 指定将下载的文件保存为 nuctl。如果没有这个参数,文件会以原始名称 nuctl-1.12.8-linux-amd64 保存。
第二步:授予文件可执行权限

下载下来的文件默认是没有执行权限的,您需要手动添加。

chmod +x nuctl

命令解释:

  • chmod (Change Mode): 这是 Linux 中用于改变文件权限的命令。
  • +x: 表示为文件添加 (+) 可执行 (x) 权限。
  • nuctl: 您要修改权限的目标文件。
第三步:将文件移动到系统的 PATH 路径下

为了能够在任何目录下直接使用 nuctl 命令(而不是每次都要输入 ./nuctl),您需要将这个可执行文件移动到一个系统环境变量 PATH 所包含的目录中。/usr/local/bin 是存放这类文件的标准位置。

sudo mv /path/1.12.8/nuctl-1.12.8-linux-amd64 /usr/local/bin/

命令解释:

  • sudo (Superuser Do): 因为 /usr/local/bin 是一个系统目录,普通用户没有写入权限,所以需要使用 sudo 来获取临时的管理员权限来执行命令。
  • mv nuctl /usr/local/bin/: 将当前目录下的 nuctl 文件移动 (mv)/usr/local/bin 目录下。

也可以用软链接的方式:

ln -s /path/1.12.8/nuctl-1.12.8-linux-amd64 /usr/local/bin/
第四步:验证安装

最后,通过一个简单的命令来验证 nuctl 是否已经安装成功并且可以被系统正确找到。

执行命令:

nuctl version

如果安装成功,您应该会看到类似下面的输出,显示了客户端(nuctl)的版本信息:

{"client": {"version": {"label": "1.12.8","gitCommit": "22c89283a8b422114a516008882a1796d1d4d38e","os": "linux","arch": "amd64"}}
}
nuctl 的常用命令和使用方法 
1. 部署一个函数 (deploy)

这是最核心也是最常用的命令。它能将你的代码打包并部署到 Nuclio 平台上。

命令格式:

nuctl deploy [函数名] [选项]

代码解释:

  • nuctl deploy: 这是主命令,告诉 nuctl 你想要部署一个函数。
  • [函数名]: 你为这个函数起的名字,例如 my-first-function
  • [选项]: 用于提供部署所需的各种配置信息。

常用选项:

  • --path: 指定包含函数代码的本地目录或文件。
  • --runtime: 指定函数的运行时环境(即编程语言),例如 python:3.9, golang, nodejs
  • --handler: 指定函数入口。对于 Python,格式通常是 文件名:函数名,例如 main:handler
  • --trigger: 配置触发器。例如,要创建一个 HTTP 触发器,你可以这样写:--trigger "http_trigger:http"
  • --port: 如果是 HTTP 触发器,可以指定映射到宿主机的端口。
  • --namespace: 指定函数部署到的 Nuclio 命名空间(默认为 nuclio)。

示例:部署一个 Python 函数

假设你有一个 hello.py 文件,内容如下:

def handler(context, event):return "Hello from Nuclio!"

你可以使用以下命令来部署它:

# 解释:部署一个名为 'hello-py' 的函数
# --runtime python:3.9   : 使用 Python 3.9 运行时
# --path ./hello.py      : 代码文件是当前目录下的 hello.py
# --handler hello:handler  : 入口是 hello.py 文件中的 handler 函数
# --trigger myHttp:http  : 创建一个名为 myHttp 的 HTTP 触发器
# --port 8090            : 将函数的 HTTP 端口映射到宿主机的 8090 端口
nuctl deploy hello-py \--runtime python:3.9 \--path ./hello.py \--handler hello:handler \--trigger myHttp:http \--port 8090

部署成功后,你就可以通过访问 http://<你的Nuclio地址>:8090 来触发这个函数了。

2. 获取函数列表 (get function)

查看已经部署了哪些函数:

nuctl get function

代码解释:

  • nuctl get function: 获取并列出当前命名空间下的所有函数及其状态(如 ready, building)。
3. 调用函数 (invoke)

直接在命令行中测试或触发一个已经部署的函数。

命令格式:

nuctl invoke [函数名] [选项]

示例:

# 解释:调用名为 'hello-py' 的函数
# -m/--method POST    : 使用 POST 方法
# -b/--body '{"name": "world"}' : 发送一个 JSON body
nuctl invoke hello-py -m POST -b '{"name": "world"}'

这对于快速调试非常有用。

4. 查看函数日志 (logs)

实时查看函数的输出日志,方便排查问题。

nuctl logs [函数名]

你可以加上 -f--follow 选项来持续跟踪日志流。

5. 删除函数 (delete function)

当你不再需要一个函数时,可以将其删除。

nuctl delete function [函数名]

示例:

# 解释:删除名为 'hello-py' 的函数,并要求确认
nuctl delete function hello-py
如何用nuctl 和function.yaml部署

使用 nuctlfunction.yaml 文件来部署函数是一个核心操作,它告诉Nuclio平台如何将您的代码打包成一个可运行的服务。整个过程主要通过 nuctl deploy 命令完成。这个命令会读取您的 function.yaml 文件,根据其中的指令构建一个Docker镜像,然后将这个镜像作为容器化函数部署到Nuclio平台上。

前提条件

在开始之前,请确保您已准备好以下环境:

  1. Docker Desktop 或 Docker Engine 已经安装并正在运行。
  2. nuctl 命令行工具 已经安装,并配置为可以连接到您的Nuclio平台。
  3. 一个正在运行的Nuclio平台(例如,通过 quay.io/nuclio/dashboard 容器启动的)。
第一步:准备您的函数文件

您的函数通常由两部分组成:您的代码和配置文件。最佳实践是将这两个文件放在一个专用的、干净的目录中。

1. 代码文件 (例如 main.py) 这是包含您函数逻辑的Python脚本。它必须包含一个Nuclio将要调用的 handler 函数。

示例 main.py:

# main.py
def handler(context, event):"""一个简单的Nuclio处理程序,返回一条消息。"""message = "来自我的Nuclio函数的问候!"context.logger.info(message)return message

2. 配置文件 (function.yaml) 这个YAML文件是您函数的“蓝图”,它告诉Nuclio关于您函数的所有信息。

示例 function.yaml:

metadata:name: my-first-function # 您函数的名字namespace: cvat          # 函数所属的Nuclio项目/命名空间spec:description: "一个简单的 hello world 函数"runtime: 'python:3.9'    # 使用的编程语言和版本handler: main:handler      # 要调用的文件和函数 (格式为: 文件名:函数名)build:# 如果您使用标准的Nuclio基础镜像且没有额外的系统依赖,此部分是可选的。# vvvvvv 在这里设置最终的镜像名和标签 vvvvvvimage: my-sam-model:v1.0# 这是构建的基础镜像baseImage: quay.io/nuclio/base-gpu:1.14.7-py3.9-amd64platform:attributes:network: cvat_cvat # 重要:将此函数连接到您的CVAT网络
第二步:运行部署命令

当您的文件准备就绪后,打开一个终端,使用 cd 命令进入包含您函数文件的目录。然后,运行 nuctl deploy 命令。

nuctl deploy --project-name cvat --path . --verbose

命令参数详解:

  • nuctl deploy: 用于部署或更新函数的主命令。
  • --project-name cvat: 指定此函数要部署到Nuclio中的哪个项目。这有助于保持您的函数井井有条。
  • --path .: 指定函数配置文件的路径。
    • 如果您提供一个目录(比如 . 代表当前目录),nuctl 会自动在其中寻找一个名为 function.yaml 的文件。
    • 如果您的配置文件有自定义名称(例如 function-gpu.yaml),您必须提供完整的文件路径:--path ./function-gpu.yaml
  • --verbose-v: (可选但强烈推荐) 此参数会在构建和部署过程中打印详细的日志,这对于排查问题至关重要。
  • --platform local: (可选) 明确告诉 nuctl 您正在部署到一个基于本地Docker的平台。这通常是默认设置。
第三步:验证部署结果

运行命令后,nuctl 将开始构建Docker镜像并启动函数容器。

您可以通过以下几种方式来验证部署是否成功:

  1. 命令行输出:成功部署的最后一行会显示 Function deploy complete
  2. Nuclio 控制台:在浏览器中打开您的Nuclio控制台(例如 http://<您的IP>:8070)。您应该能看到您的新函数(my-first-function),并且它旁边有一个绿色的圆点,表示其状态为 "ready"(就绪)
  3. Docker:在您的终端中运行 docker ps。您会看到一个为您的函数新启动的容器,其名称类似于 nuclio-nuclio-my-first-function
关于 --image (指定镜像)

--image通常情况下是可选的,但为了规范化管理,建议使用

--image 参数并不是告诉 nuctl “请使用这个已经存在的镜像来部署”,而是告诉 nuctl “请在构建完成后,将新生成的镜像命名为这个名字”。它指定的是构建过程的输出 (Output),而不是输入。

我们来对比一下两种情况:

  • 不使用 --image 参数:

    nuctl deploy --project-name cvat --path .
    

    在这种情况下,nuctl 会自动为您构建的镜像生成一个名字。这个名字通常是 nuclio/processor-<函数名>:latest,例如 nuclio/processor-my-first-function:latest

  • 使用 --image 参数:

    nuctl deploy --project-name cvat --path . --image my-sam-model:v1.0
    

    在这种情况下,nuctl 在构建成功后,会将新生成的镜像标记为 my-sam-model:v1.0。这样做的好处非常明显:

    • 版本控制:您可以为每次重大修改赋予不同的版本号(v1.0, v1.1等)。
    • 易于识别:镜像名称清晰明了,方便您在 docker images 列表中查找。
    • 方便推送:如果您想将构建好的镜像推送到私有或公共的镜像仓库,一个规范的命名是必需的。

重要区别:请不要将命令行的 --imagefunction.yaml 文件中的 baseImage 混淆。

  • baseImage:是构建过程的起点/基础
  • --image:是构建过程的终点/成果命名

--image不配置的时候,可以在yaml文件中设置(参考前面示例)。


关于 --platform (指定平台)

当您只有一个本地Docker环境时,它是可选的。但明确指定是个好习惯。

  • platform 是什么? platform(平台)指的是您要将函数部署到哪个具体的运行环境。Nuclio是一个跨平台的工具,它可以将函数部署到多种不同的后端系统。最常见的两种平台是:

    1. local:指您本地机器上的Docker环境。这是我们一直以来使用的平台。
    2. kube:指一个Kubernetes集群。这通常用于生产环境的大规模部署。
  • 需要指定吗? nuctl 可以预先配置好一个或多个平台的信息。当您第一次在本地使用时,它通常会默认配置一个名为 local 的平台,指向本地的Docker。

    • 当它是可选的:如果您只有一个默认的 local 平台,nuctl 会自动选择它,此时您可以省略 --platform local 这个参数。
    • 当它是必需的:如果您配置了多个平台(比如,同时连接着本地Docker和一个远程的Kubernetes集群),那么您在部署时就必须使用 --platform 参数来告诉 nuctl 您到底想部署到哪里,以避免歧义。
总结
  • Nuclio 是一个让你专注于代码、无需管理服务器的高性能函数平台。
  • nuctl 是管理 Nuclio 函数的强大命令行工具。
  • 核心流程通常是:用 nuctl deploy 部署代码,用 nuctl get 查看状态,用 nuctl logs 调试,最后用 nuctl delete 清理。

Nuclio遵循一个标准的优先级规则:

  1. 命令行参数优先级最高:如果您在 nuctl deploy 命令中使用了 --image 参数,它将覆盖 function.yaml 文件中设置的任何 image 值。这对于临时测试或在CI/CD流水线中动态生成标签非常有用。

  2. 配置文件其次:如果您没有在命令中提供 --image 参数,nuctl 就会使用您在 function.yamlspec.build.image 字段定义的值。

  3. 自动生成最低:如果命令行和配置文件中都没有设置,nuctl 才会回退到自动生成镜像名的策略(例如 nuclio/processor-<函数名>:latest)。

Nuclio 在 CVAT 中的核心作用:

AI 模型的“引擎”与“管理器”

在 CVAT 的多 Docker 容器架构中,Nuclio 扮演着一个高性能无服务器(Serverless)框架的角色。您可以把它理解成一个专门用来运行和管理 AI 模型(如图像分割、目标检测模型)的独立服务。

它的主要作用可以归结为以下几点:

  1. AI 功能解耦 (Decoupling):CVAT 的核心功能是数据标注和管理。通过将计算密集型的 AI 模型推理任务交给 Nuclio,CVAT 主程序可以保持轻量化,专注于其核心业务逻辑。这使得整个系统更加稳定和易于维护。

  2. 标准化模型部署 (Standardized Deployment):Nuclio 提供了一套标准的流程和规范(通过一个 function.yaml 配置文件)来打包和部署 AI 模型。无论是 Segment Anything,还是 YOLOv5,或是其他自定义模型,都可以被封装成一个“函数”,以相同的方式部署和调用。

  3. 高性能与资源高效 (High Performance & Efficiency)

    • 低延迟:Nuclio 针对 AI 推理等需要快速响应的场景进行了优化,可以实现非常低的处理延迟,这对于交互式标注(例如点击一下立刻看到分割结果)至关重要。
    • 自动扩展:当有大量标注请求时,Nuclio 可以自动扩展运行模型的容器数量来应对高并发;当没有请求时,它可以将资源缩减到零,从而节省服务器资源。这就是“无服务器”理念的体现。
  4. 语言无关性 (Language Agnostic):虽然 CVAT 的后端主要是用 Python 和 Django 编写的,但部署到 Nuclio 的函数可以用多种语言(如 Python, Go, Node.js 等)编写,提供了极大的灵活性。

CVAT 如何通过 Nuclio 调用 Segment Anything (SAM) 模型

整个调用过程是一个清晰的、分工明确的流水线。下面是详细的步骤,解释了从用户点击到显示结果的全过程:

第一步:将 SAM 模型封装成一个 Nuclio 函数

这是准备阶段,在部署 CVAT 时就已经完成了。一个 Nuclio 函数本质上是一个包含了模型和代码的包。

  • 1. 模型代码 (main.py): 开发者会编写一个 Python 脚本。这个脚本里定义了一个核心函数,通常叫做 handler

    Python

    # 这是一个简化的示例,以说明其概念
    import sam_model_library
    import json# 在函数初始化时加载模型,避免每次调用都重新加载
    def init_context(context):context.user_data.model = sam_model_library.load_model()# 这是每次被调用时执行的主函数
    def handler(context, event):# 1. 解析来自CVAT的请求body = json.loads(event.body)image = body.get("image")points = body.get("points") # 用户点击的坐标# 2. 调用SAM模型进行推理mask = context.user_data.model.predict(image, points)# 3. 返回结果return context.Response(body=json.dumps({'mask': mask.tolist()}),content_type='application/json')
    
    • 代码目的解释:
      • init_context: 这是一个初始化函数,在函数第一次被加载时运行。它的作用是提前将庞大的 SAM 模型加载到内存中,这样后续每次处理请求时就无需重复加载,大大加快了响应速度。
      • handler: 这是真正的处理函数。它接收来自 CVAT 的 HTTP 请求 (event),解析出其中的图像数据和用户点击的坐标,然后调用模型进行计算,最后将生成的分割掩码(mask)打包成 JSON 格式返回。
  • 2. 配置文件 (function.yaml): 这是一个非常关键的 YAML 文件,它告诉 Nuclio 如何部署和运行这个函数。

    YAML

    # 这是一个简化的示例
    spec:runtime: "python:3.9"handler: "main:handler"build:dependencies:- torch- torchvision- "git+https://github.com/facebookresearch/segment-anything.git"triggers:http:kind: "http"maxWorkers: 2
    
    • 配置文件含义解释:
      • runtime: 指定运行环境,这里是 Python 3.9。
      • handler: 指定入口,格式为 文件名:函数名,这里是 main.py 文件中的 handler 函数。
      • build.dependencies: 列出了所有需要安装的 Python 依赖库,Nuclio 会在构建时自动安装它们。
      • triggers: 定义触发器。http 表示这个函数可以通过一个 HTTP URL 被调用,这是 CVAT 与其通信的方式。
第二步:CVAT 触发调用流程
  1. 用户操作:您在 CVAT 的 Web 界面中打开一张图片,选择 "Interactors" 中的 Segment Anything 工具,然后在图像上点击一个或多个点。

  2. 前端请求:CVAT 的前端(运行在您的浏览器中)会捕获这些点击坐标,并将它们连同当前的图像数据一起,打包成一个 HTTP 请求发送给 CVAT 的后端服务器。

第三步:CVAT 后端作为代理转发请求

CVAT 的后端服务器(cvat-server 容器)接收到这个请求后,它不会自己去运行 SAM 模型。它扮演一个“中间人”或“代理”的角色,将这个请求直接转发给已经部署在 Nuclio 服务上的 SAM 函数的 URL 地址。

第四步:Nuclio 执行函数并返回结果
  1. 执行推理:Nuclio 服务接收到请求后,立即调用对应的 SAM 函数(即执行 main.py 中的 handler 函数)。模型在 GPU 或 CPU 上运行,根据输入的点生成分割掩码。

  2. 返回结果:函数执行完毕后,将包含掩码数据的 JSON 结果通过 HTTP 响应返回给 CVAT 后端。

  3. 最终呈现:CVAT 后端再将这个结果传回给前端。前端的 JavaScript 代码解析返回的掩码数据,并将其作为一个图层叠加在原始图像上。最终,您就能在屏幕上实时看到由您的点击所生成的精确分割区域。


总结 🗺️

整个流程就像一个分工明确的团队:

  • 您 (用户):是决策者,通过点击发出指令(“分割这里!”)。
  • CVAT 前端:是秘书,记录您的指令并打包成正式文件。
  • CVAT 后端:是项目经理,接收文件后,不自己干活,而是把它派发给专业的部门。
  • Nuclio:是专业部门的负责人(或者说是一个强大的计算平台),它接收任务,并立即指派最合适的专家。
  • SAM 函数:是最终执行任务的专家,它完成计算(图像分割)并将成果(掩码)交回。

通过这种架构,CVAT 成功地将复杂的 AI 功能模块化,使其能够轻松地集成和管理像 Segment Anything 这样强大的模型,同时保证了整个标注工具的流畅性和可扩展性。

Nuclio的构建流程:

  1. 它会根据您指定的runtime(比如python:3.8)来选择一个对应的、预置的“构建器”镜像(handler-builder-python-onbuild)。
  2. 这个“构建器”镜像被设计用来和Nuclio官方的Python基础镜像协同工作。它期望基础镜像里已经包含了一些特定的工具和文件结构。
  3. 构建过程中,它会尝试从基础镜像里拷贝一些预编译好的组件(比如py3.8-whl这个文件)来加速构建。

问题记录:

  1. nuctl版本不一致会导致一些问题:

nuctl 的每个版本都会对应一个特定版本的“构建器”镜像 (handler-builder-python-onbuild),不同版本的构建器可能对自定义 baseImage 的处理方式不同,如果出现构建问题可以从baseImage这个方向入手解决。

     2. 不要把function.yaml文件和docker的配置文件搞混了

http://www.xdnf.cn/news/13217.html

相关文章:

  • Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析
  • [拓扑优化] 1.概述
  • 【http解析——三个版本对比】
  • 【Qt】控件 QWidget
  • 解决Excel词典(xllex.dll)文件丢失或损坏问题的终极指南:从基础到高级修复技巧
  • Netty
  • 嵌入式学习之系统编程(八)IPC、管道(有名与无名)和信号通信(6.3)
  • Python 训练 day46
  • 2.8 C/C++开发环境:VSCode+CMake+VS2017
  • 有关文心一言禁止浏览器开启调式工具的问题帖子汇总
  • uniapp实现的具备丝滑动画的标签工具栏模板
  • Linux中shell流程控制语句
  • 【为什么RabbitMQ能够控制事务?控制事务的原理】
  • DAY 49 CBAM注意力
  • C++ 类基础:封装、继承、多态与多线程模板实现
  • Python开发基础手语识别(基础框架版)
  • Ansible 错误处理:确保高效自动化
  • 【工具】Configurable-HTTP-Proxy 使用指南
  • 倒装芯片凸点成型工艺
  • TSN交换机正在重构工业网络,PROFINET和EtherCAT会被取代吗?
  • 相关类相关的可视化图像总结
  • Polarr:手机修图,专业与创意并存
  • 数据库管理与高可用-MySQL故障排查与生产环境优化
  • 一种新的编程语言,这种新编程语言叫做『人类语言』
  • 基于大模型预测原发性急性闭角型青光眼的技术方案研究大纲
  • Django RBAC项目后端实战 - 03 DRF权限控制实现
  • 无菌药厂通信架构升级:MODBUS TCP转CANopen技术的精准控制应用
  • 云原生时代的系统设计:架构转型的战略支点
  • Electron简介(附电子书学习资料)
  • 什么是日内融?日内融交易系统开发全解析