【2023 Intel有奖征文】基于爱克斯板开发属于自己的AI作画助手

爱克斯板:
英特尔数字化开发套件AIxBoard(X板)是一款IA架构的人工智能嵌入式开发板,体积小巧功能强大,可让您在图像分类、目标检测、分割和语音处理等应用中并行运行多个神经网络。它是一款面向专业创客、开发者的功能强大的小型计算机,借助OpenVINO工具套件,CPU、iGPU都具备强劲的AI推理能力,为您下一款基于 AI 的产品进行原型设计并将其快速推向市场的理想解决方案。
OpenVINO:
OpenVINO是英特尔基于自身现有的硬件平台开发的一种可以加快高性能计算机视觉和深度学习视觉应用开发速度工具套件,支持各种英特尔平台的硬件加速器上进行深度学习,并且允许直接异构执行。支持在Windows与Linux系统,Python/C++语言。OpenVINO最显著的3个特点是:高性能深度学习推理,简化开发 易于使用,一次编写 任意部署。
SD
Stable Diffusion是一种潜在扩散模型(Latent Diffusion Model),能够从文本描述中生成详细的图像。它还可以用于图像修复、图像绘制、文本到图像和图像到图像等任务。简单地说,我们只要给出想要的图片的文字描述在提Stable Diffusion就能生成符合你要求的逼真的图像!
我们今天一起尝试在爱克斯板上实现文生图,看看效果如何。
1. 基础环境
OS:Windows11
软件:
- Python:miniconda
- OpenVINO
- git
硬件:
- 爱克斯版
- 硬盘
2. 安装Python环境
我们为了操作方便,可以远程连接到爱克斯开发板(后面简称为开发板)
安装miniconda
打开CMD确认Python是否安装成功
3. 安装git
官网:Git - Downloading Package (git-scm.com)
其实选择的都是默认,至此Git也完成了安装。
如果你看到如下报错
则需要添加一下环境变量
4. 创建项目虚拟环境
我们将项目保存在D盘(这是我额外安装的一块固态硬盘,如下图)
后续我们还需要创建虚拟内存,也是配置在这块硬盘上的。
1. 创建Python3.9的虚拟环境
cd D:\Work
conda create -n py39 python==3.9.0 -y
激活虚拟环境
conda activate py39
2. 拉取stable_diffusion.openvino项目
我们可以先已这个项目为基础,将SD的环境准备好,并通过OpenVINO加速。
git clone --depth=1 https://github.com/openvinotoolkit/openvino_notebooks.git
创建openvino_env
python -m venv openvino_env
openvino_env\Scripts\activate
3. 安装环境依赖文件
cd openvino_notebook***r/>python -m pip install --upgrade pip wheel setuptool***r/>pip install -r requirements.txt
6. 设置虚拟内存
在windows上设置虚拟内存还是比较简单的。
进入高级系统设置
点击设置
选择高级
点击更改
去掉自动管理....
并选中D盘
选择自定义
并设置20G的虚拟内存,点击设置
进行保存。
完成设置。需要重启电脑生效。
7. 文生图效果查看
运行以下命令启动notebooks
jupyter lab notebooks
逐个单元格运行一下即可看到效果,如果pip 执行的比较慢可以修改一下代码,例如:
%pip install -q "optimum-intel[openvino,diffusers]" "ipywidgets" "transformers >= 4.31" -i https://pypi.mirrors.ustc.edu.cn/simple/
第一次运行时会下载一下模型文件
当在出图的过程中,我们可以观察一下CPU和内存的占用情况
很明显,如果不设置虚拟内存是没有办**常运行的,如果要想速度快一些,建议搭建也是使用固态硬盘这样效果会好一些。
去掉下载模型的时间,使用原生的方法出图大概15分钟左右,效果如下
接下来我们使用OpenVINO优化后可以节省三分之一的时间,因此我们后续会使用OpenVINO优化后的方案进行案例的落地。由于篇幅问题,这里先暂时告一段落。项目部分我们再另写一篇文章。
8. 注意点
1. 用户名不要使用中文
我们在用OpenVINO转换模型的时候,会在temp文件夹下保存临时文件,如果用户名为中文很可能导致文件保存失败。如果不想重新搞环境,可以在环境变量里面修改temp的设置
2. 项目启动报错
如果path有问题,可能导致启动不了,我这边的解决方案是修改了__init__.py
# -*- coding: utf-8 -*-
# Copyright (C) 2018-2023 Intel Corporation
# SPDX-License-Identifier: Apache-2.0
"""openvino module namespace, exposing factory functions for all ops and other classe*******r/># noqa: F401
import o***r/>import sy***r/>
if sys.platform == 'win32':
# Installer, yum, pip installs openvino dlls to the different directorie***r/> # and those paths need to be visible to the openvino module***r/> #
# If you're using a custom installation of openvino,
# add the location of openvino dlls to your system PATH.
#
# looking for the libs in the pip installation path by default.
openvino_libs = [os.path.join(os.path.dirname(__file__), '..', '..', 'openvino', 'lib******r/> # setupvar***at script set all libs paths to OPENVINO_LIB_PATHS environment variable.
openvino_libs_installer = os.getenv('OPENVINO_LIB_PATHS')
if openvino_libs_installer:
openvino_libs.extend(openvino_libs_installer.split(';'))
for lib in openvino_libs:
lib_path = os.path.join(os.path.dirname(__file__), lib)
if os.path.isdir(lib_path):
# On Windows, with Python >= 3.8, DLLs are no longer imported from the PATH.
if (3, 8) <= sys.version_info:
os.add_dll_directory(os.path.abspath(lib_path))
# 加上这句
os.environ['PATH'] = os.path.abspath(lib_path) + ';' + os.environ['PATH']
else:
os.environ['PATH'] = os.path.abspath(lib_path) + ';' + os.environ['PATH']
from .ie_api import *
__all__ = ['IENetwork', 'TensorDesc', 'IECore', 'Blob', 'PreProcessInfo', 'get_version']
from openvino.utils import _add_openvino_libs_to_search_path
_add_openvino_libs_to_search_path()
from openvino._pyopenvino import get_version
# -*- coding: utf-8 -*-
# Copyright (C) 2018-2021 Intel Corporation
# SPDX-License-Identifier: Apache-2.0
__version__ = get_version()
# Openvino pybind bindings and python extended classe***r/>from openvino._pyopenvino import Dimension
from openvino._pyopenvino import Input
from openvino._pyopenvino import Output
from openvino._pyopenvino import Node
from openvino._pyopenvino import Type
from openvino._pyopenvino import PartialShape
from openvino._pyopenvino import Shape
from openvino._pyopenvino import Stride***r/>from openvino._pyopenvino import CoordinateDiff
from openvino._pyopenvino import DiscreteTypeInfo
from openvino._pyopenvino import AxisSet
from openvino._pyopenvino import AxisVector
from openvino._pyopenvino import Coordinate
from openvino._pyopenvino import Layout
from openvino._pyopenvino import ConstOutput
from openvino._pyopenvino import layout_helper***r/>from openvino._pyopenvino import OVAny
from openvino._pyopenvino import RTMap
from openvino.runtime.ie_api import Core
from openvino.runtime.ie_api import CompiledModel
from openvino.runtime.ie_api import InferRequest
from openvino.runtime.ie_api import Model
from openvino.runtime.ie_api import AsyncInferQueue
from openvino._pyopenvino import Version
from openvino._pyopenvino import Tensor
from openvino._pyopenvino import Extension
from openvino._pyopenvino import ProfilingInfo
from openvino._pyopenvino import get_batch
from openvino._pyopenvino import set_batch
from openvino._pyopenvino import serialize
from openvino._pyopenvino import save_model
from openvino._pyopenvino import shutdown
# Import opset***r/>from openvino.runtime import opset1
from openvino.runtime import opset2
from openvino.runtime import opset3
from openvino.runtime import opset4
from openvino.runtime import opset5
from openvino.runtime import opset6
from openvino.runtime import opset7
from openvino.runtime import opset8
from openvino.runtime import opset9
from openvino.runtime import opset10
from openvino.runtime import opset11
from openvino.runtime import opset12
# Import properties API
from openvino.runtime import propertie***r/>
# Helper functions for openvino module
from openvino.runtime.ie_api import tensor_from_file
from openvino.runtime.ie_api import compile_model
# Extend Node class to support binary operator***r/>Node.__add__ = opset12.add
Node.__sub__ = opset12.subtract
Node.__mul__ = opset12.multiply
Node.__div__ = opset12.divide
Node.__truediv__ = opset12.divide
Node.__radd__ = lambda left, right: opset12.add(right, left)
Node.__rsub__ = lambda left, right: opset12.subtract(right, left)
Node.__rmul__ = lambda left, right: opset12.multiply(right, left)
Node.__rdiv__ = lambda left, right: opset12.divide(right, left)
Node.__rtruediv__ = lambda left, right: opset12.divide(right, left)
Node.__eq__ = opset12.equal
Node.__ne__ = opset12.not_equal
Node.__lt__ = opset12.les***r/>Node.__le__ = opset12.less_equal
Node.__gt__ = opset12.greater
Node.__ge__ = opset12.greater_equal