PaddlePaddle / Paddle

PArallel Distributed Deep LEarning: Machine Learning Framework from Industrial Practice (『飞桨』核心框架,深度学习&机器学习高性能单机、分布式训练和跨平台部署)
http://www.paddlepaddle.org/
Apache License 2.0
22.24k stars 5.58k forks source link

在docker中使用paddle,在python improt cv2时报错,但是本机的python import cv2是正常的 #8880

Closed Yight001 closed 6 years ago

Yight001 commented 6 years ago

在docker中使用python时 import cv2时报错,但在本机却没问题

qq 20180308174250

使用paddle时,也会报错

qq 20180308185054

问题应该就是在docker的python库中找不到opencv,但是没有什么好的方法解决,求大神帮帮忙!

yeyupiaoling commented 6 years ago

@Yight001 您好,docker容器跟本机的环境是完全分离的,所以您在本机安装cv2,对docker是不会影响的

Yight001 commented 6 years ago

@yeyupiaoling 但是之前在本机安装的numpy在docker中就能正常使用

yeyupiaoling commented 6 years ago

@Yight001 您先了解Docker容器,如果不熟悉,可以在电脑本机上使用PaddlePaddle 也可以参考这个文章:http://blog.csdn.net/tengxing007/article/details/54380732

ranqiu92 commented 6 years ago

docker与本机是分离的,在docker里输入pip list 看下装了哪些python包

wangkuiyi commented 6 years ago

答疑

我估计 @Yight001 说的“host上安装的CV2在Docker里能用”其实是Docker image里也有CV2。

理论上有一种做法,可以让 Docker container 使用host上的Python package —— 在启动 container 的时候使用 -v 参数把host上的Python package directory map到container里。不过这不是一个好办法,因为host上和 container 里的的Python interpreter 可能不是同一个版本,所以他们的package不一定能通用。

解惑

如果要build一个Docker image,能用来跑依赖OpenCV和PaddlePaddle的Python程序,可以:

  1. 写一个Dockerfile,从官方PaddlePaddle Docker image派生自己的image。
  2. 这个Dockerfile里写明安装 python-opencv package。
  3. Build这个新的image。
  4. 运行这个image,启动其中的Python 解释器,并且import image里安装的paddle和cv2

验证

我在我的MacBook Pro上按照上述过程实践了一下,验证通过。

  1. 我的/tmp/cv2paddle/Dockerfile的内容如下:

    FROM paddlepaddle/paddle:latest
    MAINTAINER Yi Wang <yi.wang.2005@gmail.com>
    
    RUN apt-get update && apt-get install -y python-opencv
  2. 我用如下命令build我的image:

    cd /tmp/cv2paddle
    docker build -t cv2paddle .
  3. 用如下命令运行我的image,并且在其中启动一个Python 解释器,来验证可以import paddle和cv2:

    yi@Yis-Mac-mini cv2paddle $ docker run --rm -it cv2paddle /bin/bash
    root@c767b69c8ce5:/# python
    Python 2.7.12 (default, Dec  4 2017, 14:50:18) 
    [GCC 5.4.0 20160609] on linux2
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import paddle.v2 as paddle
    >>> import cv2
    >>> 

    我没有做进一步的验证,但是至少以上步骤确保import paddle和cv2都没问题。

其他

可能大家会问为什么不在PaddlePaddle的标准Docker image里事先安装好 OpenCV2。其实团队还真讨论过这个可能性。但是OpenCV设计好几十个Ubuntu packages,会让 Docker image 大小剧增。而且国内访问Dockerhub速度很慢,并且非computer vison领域的AI开发者不会用到 OpenCV,所以最终决定不装。

如果有兴趣,欢迎一个负责computer vison的团队基于上述例子Dockerfile维护一个 PaddlePaddle for Vision 的 标准 image。

Yight001 commented 6 years ago

大神@wangkuiyi,我对Docker不是很熟悉,找了很多资料,我尝试您的做法,但是始终不能build这个镜像 docker build -t cv2paddle . 中的cv2paddle是 文件夹的名字吗?还有/tmp/cv2paddle/Dockerfile这个路径是本机的路径吗?

typhoonzero commented 6 years ago

docker build -t cv2paddle . 这个命令中-t cv2paddle是指定build生成的镜像的名字。后面的.是指在当前目录.下寻找Dockerfile文件并使用该文件build cv2paddle这个镜像。

yeyupiaoling commented 6 years ago

@Yight001 如果你不了解使用Dockerfile构建一个镜像,可以在原来的镜像安装和更新你的库,使用命令

docker run -t -i 你的镜像 /bin/bash

然后使用exit退出,在退出之前要记住镜像的ID,然后提交生成一个新的镜像

docker commit -m="提交信息" -a="作者" 刚才记录的ID 镜像名称

要注意是ID是你进入镜像看到的ID,比如root@1234566,那么1234566就是ID 镜像名称的结构是:REPOSITORY:TAG

Yight001 commented 6 years ago

@yeyupiaoling 在镜像中如何更新我的库呢,按照您的方法进入了指定的镜像

qq 20180309135813

Yight001 commented 6 years ago

我在镜像中安装了opencv但是还是报错

qq 20180309153601

typhoonzero commented 6 years ago

Try apt-get install libglib2.0-0, if this still does not work, try find whether libgthread-2.0.so.0 exists and export LD_LIBRARY_PATH to it's directory.

Yight001 commented 6 years ago

感谢大家的帮助,在参考了你们的方法后,这个问题得以解决。我的解决方法是在有opencv的镜像中,安装paddle,这样就可以import paddle.v2 和 import cv2。