本文解决的问题:如何在带GPU的服务器上使用GPU加速,获取Bert句向量,使用的开源项目为:
https://github.com/hanxiao/bert-as-service

1.首先需要在服务器上正确安装nvidia显卡驱动、cuda和cudn

$ nvidia-smi #查看驱动是否安装成功

终端输入上述指令(如无权限请加sudo),若列出了GPU的信息列表则表示驱动安装成功。
驱动下载链接:https://www.nvidia.com/Download/index.aspx?lang=en-us
cuda10.0下载链接:https://developer.nvidia.com/cuda-toolkit-archive
cudnn官方链接:https://docs.nvidia.com/deeplearning/sdk/cudnn-install/index.html

  1. 创建虚拟环境(也可在base环境中使用)
    该方式基于linux服务器已安装了anaconda,可以使用conda指令。
    需要注意的是,这里需要安装tensorflow-gpu即tensorflow的GPU稳定版,使用常规的tensorflow运行bert-as-service不会报错也能看到打印出的信息中用了gpu,但就是没有GPU加速。
    $ conda create --name my_env_name python=3.6 pip tensorflow-gpu numpy pandas 
    #后面可加自己想要的包名
    $ conda activate my_env_name # 激活刚才创建的虚拟环境,离开该环境使用conda deactivate指令
    $ python -m pip install -U bert-serving-server # pip报错时可用它替代
    # 安装bert-as-service服务器端,注意只能用pip,conda查找不到
    安装完tensorflow-gpu后,检验一下.
    $ conda activate my_env_name # 激活刚才创建的虚拟环境
    $ python # 进入python环境
    import tensorflow as tf  # 导包无报错,安装成功
    exit # 退出python环境
    安装成功,至此bert-as-service软件环境配置完成。
    提示,使用清华pypi镜像可提升pip安装包的***:
    $ pip install pip -U  
    $ pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
  2. 在激活的环境中,启动bert-as-service服务器端:
    bert模型下载地址在https://github.com/hanxiao/bert-as-service中有给出,下载后使用需解压.
    $ conda activate my_env_name # 激活刚才创建的虚拟环境
    $ cd /data/chinese_L-12_H-768_A-12/BertTemp
    # 在下载的bert模型中创建一个临时文件夹,用于拉取bert特征时使用
    # 注意这里与windows系统不同,linux下使用bert一定要切换到一个提前设好的临时目录,不然会在home下产生很多临时文件夹.
    $ bert-serving-start -model_dir /data/chinese_L-12_H-768_A-12 -num_worker=2 -max_seq_len=NONE -max_batch_size=28
    # 指定bert模型路径,指定服务器端数目为2(与显卡数目一致,当多余该数目的客服端请求时需排队);
    # 指定max_seq_len句子最大长度为None(依输入句子长度动态调整,但不超过bert训练时的512个字符),
    # 指定max_batch_size每个worker能同时处理的为句子数目为28,在大的max_seq_len下,为避免GPU出现OOM显存溢出,需将该值设小.
    使用bert-as-service若出现OOM显存溢出,则需调整max_seq_len和max_batch_size的搭配,使得在显存利用率最大的情况下能够处理指定长度的句向量获取请求。
    # 可使用nohup挂起该任务,使其在终端关闭后仍在服务器后台运行
    $ nohup bert-serving-start -model_dir /data/chinese_L-12_H-768_A-12 -num_worker=2 -max_seq_len=NONE -max_batch_size=28 &
  3. 在其他cpu机器上,获取句向量:
    $ pip install bert-serving-client # 首先得安装bert-as-service的客户端包
    from bert_serving.client import BertClient
    bert = BertClient(ip='localhost',show_server_config=True) # ip为服务器ip地址,本机为localhost或不写
    test_vector = bert.encode(["今天天气很好","这是一个示例"])