首页 > 编程问答 >部署 Blender 脚本以用作 Web 服务器上的 api

部署 Blender 脚本以用作 Web 服务器上的 api

时间:2024-07-30 16:37:03浏览次数:16  
标签:python amazon-web-services blender

我在 Nextjs 中有一个网站和一个混合器脚本,它获取图像、纹理图像并将它们合并在一起,同时应用一些视觉效果(如深度)、渲染结果并将渲染结果的 png 图像返回到前端以供使用网站中的 img 标签。 我制作了一个 python Flask 应用程序,安装了搅拌机,并制定了将搅拌机作为子进程运行的路线,并且它在本地工作正常,我使用搅拌机路径在子进程中运行脚本。 然而,在部署到 Linux 服务器时,即使添加了必要的库(如 mesa、libx)并尝试使用 xvfb 运行它之后,我仍然遇到很多错误。 我最后一次尝试使用 digitalocean Linux 服务器并使用 xvfb 运行搅拌机取得了成功,但渲染一个几何形状需要 8 分钟,而在 Windows 电脑上需要 1-2 秒。 任何人都可以帮助我使用 Blender 脚本部署 python Flask 应用程序,以解决使用 Linux 服务器的常见陷阱,或者推荐托管解决方案或服务器类型(带有 GPU 的 aws linux...等)。任何帮助将不胜感激。


当然,将 Blender 脚本作为 API 部署到网络服务器上可能很棘手,尤其是在 Linux 环境中。让我们来分析一下挑战以及如何克服这些挑战:

所面临的问题:

  • 依赖关系: Blender 依赖于大量的库(OpenGL、X11 等)才能正常运行,在服务器环境中正确配置这些库可能会很麻烦。
  • 图形环境: Blender 的设计初衷是在图形环境中运行,而无头服务器通常缺乏此环境。的 xvfb 解决方案可以解决这个问题,但会增加开销,从而导致渲染时间较慢。
  • 性能: 正如所经历的,即使使用 xvfb,与本地设置相比,服务器上的渲染速度也可能很慢。这很可能是由于硬件差异(例如,缺乏专用 GPU)或服务器环境的优化不足造成的。

解决方案和建议:

  1. 针对 Blender 优化的云提供商:

  2. 带有 GPU 的 AWS: 正如所指出的,AWS(以及其他云提供商,如 Google Cloud、Azure)提供带有专用 GPU 的虚拟机。选择 NVIDIA GPU(如 Tesla T4 或更高版本)以获得最佳性能。

  3. 渲染农场: 对于大量渲染或需要快速周转时间,请考虑使用渲染农场(例如,RenderStreet、SheepIt)。这些服务专门用于 Blender 渲染,并提供强大的硬件和优化的软件环境。

  4. 容器化:

  5. Docker: 使用 Docker 创建一个包含的 Flask 应用程序、Blender 及其所有依赖项的 Docker 映像。这确保了一个一致且可重现的环境,并且可以在不同的部署目标之间轻松迁移。

  6. 示例 Dockerfile:

    ```dockerfile FROM nvidia/cuda:11.0-base # 或适合 Blender 版本的 CUDA 版本

    # 安装依赖项 RUN apt-get update && apt-get install -y \ blender \ libgl1-mesa-glx \ xvfb \ # ...其他依赖项

    # 将的 Flask 应用程序和 Blender 脚本复制到容器中 COPY . /app WORKDIR /app

    # 设置启动命令 CMD ["xvfb-run", "-a", "blender", "-b", "--python", "your_blender_script.py"] ```

  7. API 设计:

  8. 异步任务: 不要让的 API 端点阻塞渲染过程。改用像 Celery 或 Redis Queue 这样的任务队列来处理渲染作业。这样,的 API 可以立即返回一个作业 ID,并且客户端可以在渲染完成后轮询结果。

  9. 缓存: 如果可能的话,缓存渲染的图像以减少重复请求的处理时间。

  10. 优化:

  11. Blender 无头渲染: 确保使用 blender -b 命令行选项以无头模式运行 Blender,这可以禁用不需要的 GUI 元素并提高性能。

  12. 降低渲染设置: 调整渲染设置(例如,样本数量、光线深度)以在质量和速度之间取得平衡。
  13. Blender 优化: 探索 Blender 特定的优化技术,例如使用 CPU 渲染、优化场景几何形状和使用高效的材料。

实施步骤(使用带有 GPU 的 AWS 和 Docker 的示例):

  1. 创建一个带有 GPU 的 AWS 实例: 选择一个带有适当 NVIDIA GPU 的 EC2 实例类型。
  2. 安装 Docker: 在的 EC2 实例上安装 Docker。
  3. 构建的 Docker 映像: 使用上述示例 Dockerfile 作为起点,创建包含的 Flask 应用程序、Blender 脚本和所有依赖项的 Docker 映像。
  4. 将的映像推送到存储库: 将的 Docker 映像推送到 Docker Hub 或选择的其他容器注册表。
  5. 在 AWS 上部署的 Docker 容器: 使用 AWS ECS、EKS 或 AWS Fargate 等服务在的 EC2 实例上部署和运行的 Docker 容器。
  6. 使用的 API: 使用应用程序的端点,从的 Next.js 前端发送请求到的 Flask API。

请记住在整个过程中监控性能并根据需要调整的设置。祝一切顺利!如果还有其他问题,请告诉我。

标签:python,amazon-web-services,blender
From: 78810577

相关文章

  • 如何让 Python 请求信任自签名 SSL 证书?
    importrequestsdata={'foo':'bar'}url='https://foo.com/bar'r=requests.post(url,data=data)如果URL使用自签名证书,则会失败requests.exceptions.SSLError:[Errno1]_ssl.c:507:error:14090086:SSLroutines:SSL3_GET_SERVER_CERTIF......
  • python 偏函数
    如下代码loop=tornado.ioloop.IOLoop.current()ctx=contextvars.copy_context()func_call=functools.partial(ctx.run,func,*args,**kwargs)returnawaitloop.run_in_executor(executor,func_call)偏函数一个函数作为模板,通过提供部分参数来产生一个新的函数。......
  • Chapter 18 Python异常
    欢迎大家订阅【Python从入门到精通】专栏,一起探索Python的无限可能!文章目录前言一、什么是异常二、捕获异常三、异常的传递前言在Python中,异常是一种特定的对象,能够在程序运行过程中被抛出和处理。有效地管理异常不仅可以增强程序的稳定性,还可以提高用户体验,使程......
  • Python正则表达式匹配数字的第一次重复
    示例:For0123123123,1应匹配,因为第二个1出现在任何其他数字重复之前。For01234554321,5应该匹配,因为第二个5出现在任何其他数字的重复之前。我尝试过的一些正则表达式:......
  • 当 python 极坐标中某些列条目为空时,如何分解 List[_] 列?
    给定如下所示的Polarsdf,如何在两列上调用explode(),同时将空条目扩展到正确的长度以与其行匹配?shape:(3,2)┌───────────┬─────────────────────┐│x┆y││---┆---......
  • 使用python从网站自动下载pdf时出错
    我想从一个名为epadossier.nl的网站自动批量下载pdf我用谷歌搜索了这个并找到了一段代码并修复了一个小错误。所以现在我得到了这个`importrequestsurl="https://www.epadossier.nl/adres/plaats/straat/num"response=requests.get(url)ifresponse.status_cod......
  • 避免字符串连接的嵌套循环的 Pythonic 方法
    我想找到所有5位数字的字符串,其中前三位数字在我的第一个列表中,第二个槽第四个数字在我的第二个列表中,第三到第五个数字在我的最后一个列表中:l0=["123","567","451"]l1=["234","239","881"]l2=["348","551","399"......
  • Python 环境配置(二)安装jupyter、matplotlib、numpy库
    Python环境配置(二)安装jupyter、matplotlib、numpy库一、numpypipinstallnumpy二、matplotlibpipinstallmatplotlib三、jupyter1、anaconda自带Jupyter2、pycharm插件只有Pycharm的Professional版才支持JupyterNotebook,请注意版本3、新建文件#%......
  • 如何使用 PIPE 并行运行 python 子进程?
    我正在使用inkscape将一堆SVG图像转换为PNG。单线程:importsubprocessimporttimeimportosinkscape_path=r'C:\ProgramFiles\Inkscape\bin\inkscape.com'steps=30filenames=[]processes=[]#t_start=time.process_time()t_start=time.time()f......
  • Python sqlite3 删除数据
    要从SQLite表中删除记录,你需要使用DELETEFROM语句。要删除特定的记录,你需要同时使用WHERE子句。要更新特定的记录,你需要同时使用WHERE子句。语法以下是SQLite中DELETE查询的语法- DELETEFROMtable_name[WHEREClause]PythonCopy例子假设我们使用以下查询创建了......