离线状态下配置深度学习服务器-在ubuntu16.04 上安装python,pip以及包

最近需要把一台不能联网的电脑配置成服务器,而且只能插光盘,需要安装ubuntu16.04系统,然后安装python3.7和python包,包括需要安装jupyter 和paddle,pytorch和tensorflow等框架.
一般来说,ubuntu系统安装各种环境和包都是在线安装,那么怎么实现离线安装呢?经过近五天的摸索,经历了各种莫名其妙的BUG和一次系统崩溃后,终于还是完成了安装和配置,下面整理一下安装过程,方便自己查看,也希望可以帮到有需要的同学.

准备工作:
1.制作一个和能联网的电脑上的系统一样的启动光盘.参考:制作ubuntu光盘启动盘,我的系统是ubuntu16.04.06,所以启动盘也做的是这个系统.这么做的原因是:离线服务器上的安装包必须通过联网电脑来下下载,否则在离线服务器上可能安装不上.
2.准备联网电脑一样版本的python和pip.不然可能安装不上.
3.在windows 下刻录光盘一定要选择CD/DVD格式刻录,否则ubuntu系统可能读不了,如果不能主动挂载上,那就使用命令:

sudo  mount -t udf /dev/sr0 /mnt

或者

打开/etc/fstab
# /etc/fstab: static file system information.
找到:
/dev/sr0 /mnt udf,iso9660 user,noauto,iocharset=utf8 0 0
前加如#
/dev/sr0 /mnt udf,iso9660 user,noauto,ro,iocharset=utf8 0 0
保存后重启就正常了,可以打开udf格式光盘了

但是现在有个bug,只要在ubuntu上读过一遍的光盘,再放到window下刻录之后,ubuntu就无法再读取新刻录的文件.不知道有没有大神知道解决方法,指点一下.
在系统装好之后,那么就可以开始配置环境了
一.安装python3.7
可以参考本人博客:ubuntu 安装多个版本的python,并使用jupyter notebook访问多个python版本
这是使用下载源码然后编译出python和pip的方式.但是编译之前需要安装许多依赖库,因此很有可能编译失败,这就又涉及到离线安装库的问题,因为在线一般都是使用apt-get install 安装.这个下节再讲.
后来考虑到系统完全一样,中间离线装依赖又不怎么会装,一直编译不成功,后来就灵光一闪,为何不直接从我的电脑上把编译好的python直接拷贝到服务器上的同一位置.编译好的python3.7下载
cd 进入python所在的位置,执行命令:

sudo cp -r python3.7  usr/local/
sudo ln -s /usr/local/python3.7/python3.7 /usr/bin/python3.7
sudo ln -s /usr/local/pip3.7 /usr/bin/pip3.7
#执行python3.7可会报错:没有权限
#那么接着执行
sudo chmod 777 /usr/bin/python3.7
sudo chmod 777 /usr/bin/pip3.7

现在就可以正常使用了,并且刻录或者拷贝过去的软件和包一定要先压缩成一个文件,否则有些文件可能会复制不了.
二.安装setuptools和pip
新安装系统自带的python2.7和python3.5没有pip,只能通过:

sudo apt install python3-pip

安装.
那么对于离线状态,方式有两种
第一种方式是找到python3-pip的deb安装包,然后通过dpkg-i 的方式安装.这种方式的具体方法后面再讲.
第二种方式是去官网下载pip包的源代码通过编译的方式安装.pip源码和.whl下载官网
注意先使用

pip3 -V

查看一下自己电脑python对应的pip版本,pip版本和python版本最好是一样,不然后面装python库可能会因为版本问题装不上.
安装pip之前可能还需要先安装setuptools,也需要通过编译的方式安装,下载源码:setuptools源码和.whl下载官网
最好也查一下自己电脑的python对应的setuptools版本,然后在下载一样的版本,否则也有可能装不上.
版本不一样会报莫名奇妙的错误,我就是在这上面吃了很大的亏,所以尽量保持版本一样.
可以这样查看其版本:
打开终端:

python3
import setuptools as s 
print(s.__version__)

准备就绪之后,就可以开始安装了,首先安装setuptools.

sudo unzip setuptools-40.6.2.zip
cd setuptools-40.6.2
sudo python3 setup.py build
sudo python3 setup.py install
```
安装pip
```py
sudo tar -zxvf pip-18.1.tar.gz
cd pip-18.1
sudo python3 setup.py build
sudo python3 setup.py install
```
有了pip之后就可以使用pip安装python包了,就可以下载官网上的.whl文件对pip进行升级.

三.安装python第三方模块
安装了pip之后就可以开始准备安装包了.主要分两步:
1.从连网电脑把包下载下来.
2.把包拷贝到离线服务器上.
1.在联网的电脑中下载python第三方模块.
以下载jupyter为例,因为jupyter 安装之前需要安装很多的依赖包,所以下载过程中也会把依赖包一起下载下来,所以要把这些所有的包放在一个文件夹下,因此建立jupyter 文件夹.

mkdir jupyter

然后下载包

pip3 download jupyter  -d jupyter  #如果没有创建jupyter会自动创建

#默认情况download是最新版本模块,但有时候我们需要下载指定模块版本,比如下面我们下载jupyter的1.0.0版本。

pip3 download jupyter==1.0.0 -d jupyter

也可以使用如下方式批量下载模块,但是不推荐,因为依赖包的存在,批量安装失败的可能性很大,建议还是一个包建一个文件夹下载,然后逐个安装.

#pip3 list可以查看已安装的模块
[root@localhost py_model]# pip3 list
Package      Version
------------ -------
asn1crypto   0.24.0
bcrypt       3.1.6
cffi         1.12.3
cryptography 2.6.1
paramiko     2.4.2
pip          18.1
pyasn1       0.4.5
pycparser    2.19
PyNaCl       1.3.0
setuptools   40.6.2
six          1.12.0
xlrd         1.2.0
#将pip3 list的信息生成文档
pip3 freeze >requirements.txt
#将requirement.txt文档中列出的模块信息下载到指定目录
pip3 download -r requirements.txt -d packages/  #推荐使用
或pip3 install --download packages -r requirements.txt

2.在服务器上离线安装包
把包拷贝到离线服务器上后.
以jupyter 安装为例子.jupyter 离线安装包下载
逐个安装包,

# 将下载好的模块copy到离线服务器
pip3 install xxx.tar.gz
pip3 install xxx.whl
pip3 install xxx.xx  #是什么格式就安装什么格式的文件即可。

#如果有要安装的包和依赖包有多个,且不知道先装哪个,那么就把这些文件放在一个目录中,然后进入该目录使用下面命令一起安装
cd jupyter 
pip3 install ./*

#批量离线安装requirments.txt中的模块,需要将下载好的模块和requirments.txt都copy到一个目录,然后执行下面的命令
pip3 install --no-index --find-links=packages  -r requirments.txt #这种方式安装很有可能失败

这样就可以把包一个个地安装上了,最后就是需要测试了,测试中发现jupter启动不了,代码报错,然后解决的方式比较粗暴了,可以直接查看报错代码在哪.
然后使用

sudo gedit ****

打开报错的.py文件,并定位到报错代码行,修改或者注释即可,直到不在报错了就可以了.
其他的测试包也是这样解决的,只要报错代码不会影响到核心功能,或者只是因为语法问题而报错,理论上是都可以改动的.并且包里面有些代码也有可能会错,比如说paddle有个用法不支持.

import paddle 
print(padddle.ones(5))
就会报错:
File "/home/xiaohaipeng/.local/lib/python3.5/site-packages/paddle/fluid/layers/utils.py", line 360, in convert_shape_to_list
    shape = list(shape.numpy().astype(int))
AttributeError: 'int' object has no attribute 'numpy'
#这里就是其语法有问题,我对其进行了修改即可,查看源代码:
def convert_shape_to_list(shape):
    """
    Convert shape(list, tuple, variable) to list in imperative mode
    """
    if isinstance(shape, (list, tuple)):
        shape = list(
            map(lambda x: x.numpy()[0] if isinstance(x, Variable) else x,
                shape))
    else:
        shape = list(shape.numpy().astype(int))
    return shape
#这里else 对shape为int的情况用法不对,因此我这样修改就好了
def convert_shape_to_list(shape):
    """
    Convert shape(list, tuple, variable) to list in imperative mode
    """
    if isinstance(shape, (list, tuple)):
        shape = list(
            map(lambda x: x.numpy()[0] if isinstance(x, Variable) else x,
                shape))
    else:
        shape = [shape]#list(shape.numpy().astype(int))
    return shape

问题得到解决
四 .安装库
在ubuntu系统中,安装库有两种方式,
一种是通过离线的方式安装,首先去网上下载.deb包,然后使用dpkg -i 安装.
另一种就是通过apt-get install 方式在线安装,但是实际上apt-get install 安装有两个过程,先是把.deb包下载,最后使用dpkg -i 安装.而且下载的包也会缓存下来.
下面就介绍怎么下载和离线安装包.
对于安装的包,
在下载之前,最好是先清理掉别的包,不然会很多包混杂在一起会导致安装错误,因为很多包需要安装许多依赖.

sudo  apt-get clean
#这会清理所/var/cache/apt/archives/ 和 /var/cache/apt/archives/partial/中没有被锁定的文件。

然后安装

sudo apt-get install ***
# 或者
# 仅下载安装包
sudo apt-get install *** --download-only

如果显示这个包已经被安装了,那么只能卸载后重装了,

sudo apt-get purge ***

安装过程中的.deb文件会被缓存在/var/cache/apt/archives/ 下,将其下所有的deb包迁移到指定的文件夹即可.

sudo move /var/cache/apt/archives/  /home/***/***

最后把这个文件夹拷贝到服务器上,
在这个文件夹内打开终端,执行

sudo dpkg -i *.deb

即可
之所以写这个是因为使用paddle2.0.2的过程中遇到了GLIB版本过低的问题,必须要升级(所有原装的ubuntu16.04应该都需要升级才能使用paddle2.0.2,不然只能降低版本使用paddle2.0.1版本):
在这里插入图片描述

strings /usr/lib/x86_64-linux-gnu/libstdc++.so.6 | grep GLIBCX

发现只到GLIBXX_3.4.21,那么需要升级
首先在线升级:

sudo add-apt-repository ppa:ubuntu-toolchain-r/test
sudo apt-get update
sudo apt-get install gcc-4.9
sudo apt-get upgrade libstdc++6

其中在安装gcc-4.9的时候,首先要把gcc有关的库移动到自定义文件夹gcc-4.9.
最后升级libstdc++6 的时候再建一个文件夹libstdc++6,把升级有关的库移动进去即可.
最后把这两个包拷贝到服务器上.两个离线包下载

strings /usr/lib/x86_64-linux-gnu/libstdc++.so.6 | grep GLIBCX
cd gcc-4.9
sudo dpkg -i *.deb
cd libstdc++6
sudo dpkg -i *.deb
#最后一步可能报错,但那不重要,因为里面还包括很多其他与gcc-4.9无关的库.
strings /usr/lib/x86_64-linux-gnu/libstdc++.so.6 | grep GLIBCX

升级完之后就可以看到列表里面有了GLIBXX_3.4.22.

在这里插入图片描述

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

智能学习者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值