# 使用 docker 生成 OneFlow wheel 包 ### 创建 docker 容器 在 OneFlow 源码根目录下运行: ``` docker build -f docker/package/manylinux/Dockerfile --build-arg from=nvidia/cuda:10.2-cudnn7-devel-centos7 -t oneflow:manylinux2014-cuda10.2 . ``` ### 打包 manylinux python wheel 这里有 manylinux2014(centos7) + cuda10.2 的 Dockerfile,里面安装了编译 oneflow 所需的库,假设你已经用 Dockerfile build 了一个 docker 镜像,叫做 oneflow:manylinux2014-cuda10.2,那么只要在 oneflow 源码目录运行 ```bash docker run --rm -it -v `pwd`:/oneflow-src -w /oneflow-src oneflow:manylinux2014-cuda10.2 ``` If you prefer operate inside docker: ```bash docker run --rm -it -v `pwd`:/oneflow-src -w /oneflow-src oneflow:manylinux2014-cuda10.2 bash ``` ```bash /oneflow-src/docker/package/manylinux/build_wheel.sh --python3.6 --wheel-dir /oneflow-src/wheel-test ``` 就会在 docker 镜像里执行 build_wheel.sh 来编译生成 python 3.5 到 python 3.8 的 oneflow manylinux2014 wheel。生成的包在 oneflow 源码目录下的 wheelhouse/ 文件夹内 #### 注意事项 1. 运行 `docker run` 时可能需要添加 `-e http_proxy=$http_proxy -e https_proxy=$https_proxy` 参数,以在容器内使用宿主机的代理,避免编译第三方库时因为网络问题而出错 2. 只要运行了 `cmake -DTHIRD_PARTY=ON ..`,oneflow 本体都会从头编译,所以如果第三方库已经由 docker 容器编译过,这次只想增量编译 oneflow 本体,可以用命令 ```bash docker run --rm -it -v `pwd`:/oneflow-src oneflow:manylinux2014-cuda10.2 /oneflow-src/docker/package/manylinux/build_wheel.sh --skip-third-party ``` 这会给 build_wheel.sh 传一个 `--skip-third-party` 参数,跳过第三方库的编译 3. 只想在生成某些 python 版本的包,例如 python3.5,可以用命令 ```bash docker run --rm -it -v `pwd`:/oneflow-src oneflow:manylinux2014-cuda10.2 /oneflow-src/docker/package/manylinux/build_wheel.sh --python3.5 ``` 支持的参数是 `--python3.5`、`--python3.6`、`--python3.7`、`--python3.8`,需要生成多个版本可以同时传入多个参数。不传入版本参数则会生成所有的 python 版本的包 3. 如果想自定义 oneflow 编译时的 cmake 参数,可以直接把 cmake 参数写出来,如: ```bash docker run --rm -it -v `pwd`:/oneflow-src oneflow:manylinux2014-cuda10.2 /oneflow-src/docker/package/manylinux/build_wheel.sh -DWITH_XLA=ON ```