提交 cccddbc0 编写于 作者: M Megvii Engine Team

docs(lite): opt pylite md

GitOrigin-RevId: df332ad8b77c445b31bf1bb8b85848c3821bd887
上级 b982be56
# PyLite # PyLite
Lite的python接口提供更加方便灵活的使用Lite进行模型Inference,支持各种平台上运行,X86-CUDA,X86-CPU,Arm-CPU,Arm-CUDA平台。 Lite 的 python 接口提供更加方便灵活的使用 Lite 进行模型 Inference,满足如下条件的环境都可以使用:
* OS 可以安装 [Python3](https://www.python.org/downloads/)
* [BUILD_README](../../scripts/cmake-build/BUILD_README.md) 中支持推理编译的平台
## 安装 ## 安装
### whl包安装 ### whl 包安装
Lite python接口的whl包会随着megbrain的发版发布,版本号和megbrain保持一致,目前发布的Lite的whl包,包括Linux、windows、macos平台,这些平台可以直接通过pip3安装。 目前预编译发布的 Lite 的 whl 包详情如下:
* 提供 Linux-x64(with CUDA)、windows-x64(with CUDA)、macos-x64(cpu only) 平台预编译包
* 可以直接通过 pip3 安装。其他 OS-ARCH 的包,如有需要,可以 build from src 参考 [BUILD_README](../../scripts/cmake-build/BUILD_README.md)
* 预编译包的构建流程可以参考 [BUILD_PYTHON_WHL_README.md](../../scripts/whl/BUILD_PYTHON_WHL_README.md)
开源版本: 预编译的包会随着 MegEngine 的发版发布,版本号和 MegEngine 保持一致,安装方式:
```shell ```shell
python3 -m pip install --upgrade pip python3 -m pip install --upgrade pip
python3 -m pip install megenginelite -i https://pypi.megvii-inc.com/simple python3 -m pip install megengine -f https://megengine.org.cn/whl/mge.html
``` ```
### develop 安装 安装后, 就可以通过 import megenginelite 进行使用了
开发模式下,可以使用Cmake编译出lite动态库liblite.so/liblite.dll/liblite_shared.dylib,并使用这个动态库进行开发和debug。该方式安装的pylite只能在本地机器上使用,不能copy到其他机器上使用。
* 编译liblite.so。使用cmake编译出liblite.so ### develop 调试
* clone megbrain工程到本地
开发模式下,可以使用 Cmake 编译出 lite 动态库,依然参考 [BUILD_README](../../scripts/cmake-build/BUILD_README.md):
* Windows 平台,编译出来的 dll 是 lite_shared_whl.dll
* None Windows 平台,编译出来的 so 是 liblite_shared_whl.so
* 编译上述库的步骤:
* clone 代码
```shell ```shell
git clone git@git-core.megvii-inc.com:brain-sdk/MegBrain.git 开源版本:git clone git@github.com:MegEngine/MegEngine.git
``` ```
* 进行Cmake编译,这里的cmake编译同megbrain的cmake编译,使用参数和宏也完全一样
* 编译准备 * 编译准备
```shell ```shell
cd MegBrain 开源版本: cd MegEngine
sh ./third_party/prepare.sh bash ./third_party/prepare.sh
mkdir build ```
cd build * 编译 HOST 版本:
```shell
./scripts/cmake-build/host_build.sh
``` ```
* 编译X86-CUDA版本 * 编译 HOST 版本 (with CUDA):
```shell ```shell
cmake .. -DMGE_WITH_CUDA=ON -DMGE_WITH_TEST=ON -DCMAKE_BUILD_TYPE=Release && make -j$(nproc) ./scripts/cmake-build/host_build.sh -c
``` ```
* 编译X86 CPU Only版本 * 编译 Android 平台:
```shell ```shell
cmake .. -DMGE_WITH_CUDA=OFF -DMGE_WITH_TEST=ON -DCMAKE_BUILD_TYPE=Release && make -j$(nproc) scripts/cmake-build/cross_build_android_arm_inference.sh
``` ```
* 编译完成之后,liblite.so 保存在build目录中的lite文件下
* 将liblite.so copy到megenginelite的python源文件目录下,就可以使用megenginelite了。 * 其他OS-ARCH可参考 [BUILD_README](../../scripts/cmake-build/BUILD_README.md)
* 编译完成之后,相应的库可在 build_dir 下找到, 这里假设它的目录是LITE_LIB_PATH=path_of_lite_shared_whl
* 开始使用 megenginelite
```shell ```shell
MegBrain的工程目录为 ${mgb_hone} export LITE_LIB_PATH=path_of_lite_shared_whl
cp ${mgb_hone}/build/lite/liblite.so ${mgb_home}/lite/pylite/megenginelite/ export PYTHONPATH=lite/pylite:$PYTHONPATH
cd ${mgb_home}/lite/pylite 然后就可以 import megenginelite 进行使用了
python3 -m "import megenginelite"
``` ```
这样就可以在${mgb_home}/lite/pylite 目录下面开发和debug lite的python接口了
## python3中使用megenginelite ## python3 中使用 megenginelite
Lite的python接口是对其C/C++接口的一层封装,他们使用的模型都是相同的模型格式。megenginelite提供两种数据接口,分别是LiteTensor和LiteNetwork。 Lite 的 python3 接口是对其 C/C++ 接口的一层封装,他们使用的模型都是相同的模型格式。megenginelite 提供两种数据接口,分别是 LiteTensor 和 LiteNetwork。
### LiteTensor ### LiteTensor
LiteTensor提供了用户对数据的操作接口,提供了接口包括: LiteTensor 提供了用户对数据的操作接口,提供了接口包括:
* fill_zero: 将tensor的内存设置为全0 * fill_zero: 将 tensor 的内存设置为全0
* share_memory_with: 可以和其他LiteTensor的共享内存 * share_memory_with: 可以和其他 LiteTensor 的共享内存
* copy_from: 从其他LiteTensor中copy数据到自身内存中 * copy_from: 从其他 LiteTensor 中 copy 数据到自身内存中
* reshape: 改变该LiteTensor的shape,内存数据保持不变 * reshape: 改变该 LiteTensor 的 shape,内存数据保持不变
* slice: 对该LiteTensor中的数据进行切片,需要分别指定每一维切片的start,end,和step。 * slice: 对该 LiteTensor 中的数据进行切片,需要分别指定每一维切片的 start,end,和 step。
* set_data_by_share: 调用之后使得该LiteTensor中的内存共享自输入的array的内存,输入的array必须是numpy的ndarray,并且tensor在CPU * set_data_by_share: 调用之后使得该 LiteTensor 中的内存共享自输入的 array 的内存,输入的 array 必须是numpy 的 ndarray,并且 tensor 在 CPU
* set_data_by_copy: 该LiteTensor将会从输入的data中copy数据,data可以是list和numpy的ndarray,需要保证data的数据量不超过tensor的容量,tensor在CPU * set_data_by_copy: 该 LiteTensor 将会从输入的 data 中 copy 数据,data 可以是 list 和 numpy 的 ndarray,需要保证 data 的数据量不超过 tensor 的容量,tensor 在 CPU
* to_numpy: 将该LiteTensor中数据copy到numpy的array中,返回给用户,如果是非连续的LiteTensor,如slice出来的,将copy到连续的numpy array中,该接口主要数为了debug,有性能问题。 * to_numpy: 将该 LiteTensor 中数据 copy 到 numpy 的 array 中,返回给用户,如果是非连续的 LiteTensor,如 slice 出来的,将 copy 到连续的 numpy array 中,该接口主要数为了 debug,有性能问题。
#### 使用example #### 使用 example
* LiteTensor 设置数据example * LiteTensor 设置数据 example
``` ```
def test_tensor_set_data(): def test_tensor_set_data():
layout = LiteLayout([2, 16], "int8") layout = LiteLayout([2, 16], "int8")
...@@ -89,7 +108,7 @@ def test_tensor_set_data(): ...@@ -89,7 +108,7 @@ def test_tensor_set_data():
assert real_data[0][8] == 100 assert real_data[0][8] == 100
assert real_data[1][3] == 20 assert real_data[1][3] == 20
``` ```
* tensor 共享内存example * tensor 共享内存 example
```python ```python
def test_tensor_share_memory_with(): def test_tensor_share_memory_with():
layout = LiteLayout([4, 32], "int16") layout = LiteLayout([4, 32], "int16")
...@@ -118,10 +137,10 @@ def test_tensor_share_memory_with(): ...@@ -118,10 +137,10 @@ def test_tensor_share_memory_with():
assert real_data[1][18] == 5 assert real_data[1][18] == 5
assert real_data[3][7] == 345 assert real_data[3][7] == 345
``` ```
更多的使用可以参考pylite中test/test_tensor.py中的使用 更多的使用可以参考 pylite 中 test/test_tensor.py 中的使用
### LiteNetwork ### LiteNetwork
LiteNetwork主要为用户提供模型载入,运行等功能。使用的模型见lite的readme中关于模型的部分 LiteNetwork 主要为用户提供模型载入,运行等功能。使用的模型见 lite 的 readme 中关于模型的部分
* CPU基本模型载入运行的example * CPU 基本模型载入运行的 example
``` ```
def test_network_basic(): def test_network_basic():
source_dir = os.getenv("LITE_TEST_RESOUCE") source_dir = os.getenv("LITE_TEST_RESOUCE")
...@@ -154,7 +173,7 @@ def test_network_basic(): ...@@ -154,7 +173,7 @@ def test_network_basic():
output_data = output_tensor.to_numpy() output_data = output_tensor.to_numpy()
print('shufflenet output max={}, sum={}'.format(output_data.max(), output_data.sum())) print('shufflenet output max={}, sum={}'.format(output_data.max(), output_data.sum()))
``` ```
* CUDA上使用device内存作为模型输入,需要在构造network候配置config和IO信息 * CUDA 上使用 device 内存作为模型输入,需要在构造 network 候配置 config 和 IO 信息
``` ```
def test_network_device_IO(): def test_network_device_IO():
source_dir = os.getenv("LITE_TEST_RESOUCE") source_dir = os.getenv("LITE_TEST_RESOUCE")
...@@ -196,4 +215,4 @@ def test_network_device_IO(): ...@@ -196,4 +215,4 @@ def test_network_device_IO():
output_data = output_tensor.to_numpy() output_data = output_tensor.to_numpy()
print('shufflenet output max={}, sum={}'.format(output_data.max(), output_data.sum())) print('shufflenet output max={}, sum={}'.format(output_data.max(), output_data.sum()))
``` ```
更多的使用可以参考pylite中test/test_network.py和test/test_network_cuda.py中的使用 更多的使用可以参考 pylite 中 test/test_network.py 和 test/test_network_cuda.py 中的使用
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册