docker中使用GPU+rocksdb


配置环境


 dell@dell-Precision-3630-Tower  ~  lsb_release -a
No LSB modules are available.
Distributor ID:	Ubuntu
Description:	Ubuntu 20.04.6 LTS
Release:	20.04
Codename:	focaldell@dell-Precision-3630-Tower  ~  nvcc --version
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2022 NVIDIA Corporation
Built on Wed_Sep_21_10:33:58_PDT_2022
Cuda compilation tools, release 11.8, V11.8.89
Build cuda_11.8.r11.8/compiler.31833905_0dell@dell-Precision-3630-Tower  ~  docker version
Client: Docker Engine - CommunityVersion:           24.0.6API version:       1.43Go version:        go1.20.7OS/Arch:           linux/amd64Context:           defaultServer: Docker Engine - CommunityEngine:Version:          24.0.6API version:      1.43 (minimum version 1.12)Go version:       go1.20.7OS/Arch:          linux/amd64Experimental:     falsecontainerd:Version:          1.6.24runc:Version:          1.1.9docker-init:Version:          0.19.0#安装方式:sudo apt-get install libcudnn8-dev=8.9.2.26-1+cuda11.8
cudnn:libcudnn8-dev=8.9.2.26-1+cuda11.8

目录结构


请添加图片描述

nvidia-docker和从docker 19开始提供的nvidia-container-toolkit的区别:


nvidia-docker

  • 概述nvidia-docker 是最初用于在 Docker 容器中提供 GPU 支持的工具。
  • 命令nvidia-docker 具有自己的命令行工具,并且最初被设计为 docker 命令的替代品。你可以用 nvidia-docker run 来启动一个使用 GPU 的容器。
  • 插件nvidia-docker 版本 1 和 2 都使用了 Docker 插件系统。版本 2 是 Docker 插件的一种形式,允许用户使用 --runtime=nvidia 标志与标准 docker 命令一起使用。

nvidia-container-toolkit

  • 概述:在 Docker 19.03 版本之后,Docker 引入了一个名为 GPU 的设备请求特性。nvidia-container-toolkit 是一个新的工具,允许用户使用这个新特性,而不再需要 nvidia-docker 的自定义运行时。
  • 命令:与使用 nvidia-docker 不同,使用 nvidia-container-toolkit,你可以使用常规的 docker 命令,但是添加一个 --gpus 参数来启用 GPU 支持。例如:docker run --gpus all nvidia/cuda:10.0-base nvidia-smi
  • 集成:它更紧密地集成到 Docker CLI 中,允许更好的兼容性和使用体验。

比较和推荐使用

  • nvidia-docker 版本 1 已经弃用,而版本 2 在某些用例中仍然被使用,但逐渐被 nvidia-container-toolkit 替代。
  • 对于 Docker 19.03 及更高版本,官方推荐使用 nvidia-container-toolkit,因为它提供了一个更简洁和标准的方式来在容器中使用 GPU。
  • 使用 nvidia-container-toolkit 允许开发者和运维团队在不更改工作流的情况下,简单地将 GPU 支持添加到他们现有的 Docker 容器中。
  • 尽管在一些老的代码和项目中你仍然可能会看到 nvidia-docker 的使用,但新的项目和开发通常应该使用 nvidia-container-toolkit,除非有明确的理由不这样做。

docker安装GPU工具箱nvidia-container-toolkit


参考链接:

https://zhuanlan.zhihu.com/p/544713249

sudo apt install curl
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
sudo apt-get update && sudo apt-get install -y nvidia-container-toolkit
sudo systemctl restart docker

docker拉取含cuda的镜像建立镜像


去Nvidia官网下载cuda版本的Docker:https://hub.docker.com/r/nvidia/cuda

images包含的三种风格:

  • base: Includes the CUDA runtime (cudart)

  • runtime: Builds on the base and includes the CUDA math libraries, and NCCL. A runtime image that also includes cuDNN is available.

  • devel: Builds on the runtime and includes headers, development tools for building CUDA images. These images are particularly useful for multi-stage builds.

  • NVIDIA Container Toolkit

The NVIDIA Container Toolkit for Docker is required to run CUDA images.

For CUDA 10.0, nvidia-docker2 (v2.1.0) or greater is recommended. It is also recommended to use Docker 19.03.

还是自己写一个镜像吧,该镜像拥有cudn,rocksdb环境

# from official ubuntu 20.04
# FROM ubuntu:20.04
# docker pull nvidia/cuda:11.8.0-devel-ubuntu20.04
FROM nvidia/cuda:11.8.0-devel-ubuntu20.04# RUN mv /etc/apt/sources.list /etc/apt/sources_backup.list && \
# echo "deb http://mirrors.ustc.edu.cn/ubuntu/ focal main restricted " >> /etc/apt/sources.list && \
# echo "deb http://mirrors.ustc.edu.cn/ubuntu/ focal-updates main restricted " >> /etc/apt/sources.list && \
# echo "deb http://mirrors.ustc.edu.cn/ubuntu/ focal universe " >> /etc/apt/sources.list && \
# echo "deb http://mirrors.ustc.edu.cn/ubuntu/ focal-updates universe " >> /etc/apt/sources.list && \
# echo "deb http://mirrors.ustc.edu.cn/ubuntu/ focal multiverse " >> /etc/apt/sources.list && \
# echo "deb http://mirrors.ustc.edu.cn/ubuntu/ focal-updates multiverse " >> /etc/apt/sources.list && \
# echo "deb http://mirrors.ustc.edu.cn/ubuntu/ focal-backports main restricted universe multiverse " >> /etc/apt/sources.list && \
# echo "deb http://mirrors.ustc.edu.cn/ubuntu/ focal-security main restricted " >> /etc/apt/sources.list && \
# echo "deb http://mirrors.ustc.edu.cn/ubuntu/ focal-security universe " >> /etc/apt/sources.list && \
# echo "deb http://mirrors.ustc.edu.cn/ubuntu/ focal-security multiverse " >> /etc/apt/sources.list && \
# echo "deb http://archive.canonical.com/ubuntu focal partner " >> /etc/apt/sources.list
# update system
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone \ && apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/3bf863cc.pub \&& apt clean && apt update && apt install -yq --no-install-recommends sudo \&& sudo apt install -yq --no-install-recommends python3 python3-pip libgl1-mesa-glx libglib2.0-0 libsm6 libxext6 libxrender-dev openssh-server \&& sudo pip3 install --upgrade pip \&& sudo pip3 config set global.index-url https://mirrors.aliyun.com/pypi/simple \&& sudo pip3 install setuptoolsRUN apt-get update && apt-get upgrade -y
# install basic tools
RUN apt-get install -y vim wget curl
# install tzdata noninteractive
RUN DEBIAN_FRONTEND=noninteractive TZ=Etc/UTC apt-get -y install tzdata
# install git and default compilers
RUN apt-get install -y git gcc g++ clang clang-tools
# install basic package
RUN apt-get install -y lsb-release software-properties-common gnupg
# install gflags, tbb
RUN apt-get install -y libgflags-dev libtbb-dev
# install compression libs
RUN apt-get install -y libsnappy-dev zlib1g-dev libbz2-dev liblz4-dev libzstd-dev
# install cmake
RUN apt-get install -y cmake
RUN apt-get install -y libssl-dev
# install clang-13
WORKDIR /root
RUN wget https://apt.llvm.org/llvm.sh
RUN chmod +x llvm.sh
RUN ./llvm.sh 13 all
# install gcc-7, 8, 10, 11, default is 9
RUN apt-get install -y gcc-7 g++-7
RUN apt-get install -y gcc-8 g++-8
RUN apt-get install -y gcc-10 g++-10
RUN echo "deb https://ppa.launchpadcontent.net/ubuntu-toolchain-r/test/ubuntu focal main" |tee -a /etc/apt/sources.list
RUN echo "deb-src https://ppa.launchpadcontent.net/ubuntu-toolchain-r/test/ubuntu focal main" |tee -a /etc/apt/sources.list
RUN curl -sL "http://keyserver.ubuntu.com/pks/lookup?op=get&search=0x60C317803A41BA51845E371A1E9377A2BA9EF27F" |apt-key add
#RUN apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 60C317803A41BA51845E371A1E9377A2BA9EF27F
RUN add-apt-repository -y ppa:ubuntu-toolchain-r/test
RUN apt-get update && apt-get upgrade -y
#RUN apt-get install -y gcc-11 g++-11
# install apt-get install -y valgrind
RUN apt-get install -y valgrind
# install folly depencencies
RUN apt-get install -y libgoogle-glog-dev
# install openjdk 8
RUN apt-get install -y openjdk-8-jdk
ENV JAVA_HOME /usr/lib/jvm/java-1.8.0-openjdk-amd64
# install mingw
RUN apt-get install -y mingw-w64# install gtest-parallel package
RUN git clone --single-branch --branch master --depth 1 https://github.com/google/gtest-parallel.git ~/gtest-parallel
ENV PATH $PATH:/root/gtest-parallel# install libprotobuf for fuzzers test
RUN apt-get install -y ninja-build binutils liblzma-dev libz-dev pkg-config autoconf libtool
#解决GnuTLS recv error
RUN apt-get update
RUN apt-get upgrade
RUN apt-get install --reinstall ca-certificates
RUN git clone --branch v1.0 https://github.com/google/libprotobuf-mutator.git ~/libprotobuf-mutator && cd ~/libprotobuf-mutator && git checkout ffd86a32874e5c08a143019aad1aaf0907294c9f && mkdir build && cd build && cmake .. -GNinja -DCMAKE_C_COMPILER=clang-13 -DCMAKE_CXX_COMPILER=clang++-13 -DCMAKE_BUILD_TYPE=Release -DLIB_PROTO_MUTATOR_DOWNLOAD_PROTOBUF=ON && ninja && ninja install
ENV PKG_CONFIG_PATH /usr/local/OFF/:/root/libprotobuf-mutator/build/external.protobuf/lib/pkgconfig/
ENV PROTOC_BIN /root/libprotobuf-mutator/build/external.protobuf/bin/protoc#install the latest google benchmark
RUN git clone --depth 1 --branch v1.7.0 https://github.com/google/benchmark.git ~/benchmark
RUN cd ~/benchmark && mkdir build && cd build && cmake .. -GNinja -DCMAKE_BUILD_TYPE=Release -DBENCHMARK_ENABLE_GTEST_TESTS=0 && ninja && ninja install# # clean up
# RUN rm -rf /var/lib/apt/lists/*
# RUN rm -rf /root/benchmark
#以下为build-image.sh
#!/usr/bin/env bashSHELL_HOME=$(cd "$(dirname "$0")" || exitpwd
)
source "${SHELL_HOME}/../dev.conf"# docker build --build-arg \
#   --build-arg http_proxy= xxx\
#   --build-arg https_proxy= xxx\
#   --build-arg all_proxy=socks5 \
#   --tag "${IMAGE_NAME}:${IMAGE_VERSION}" "${SHELL_HOME}"docker build --tag "${IMAGE_NAME}:${IMAGE_VERSION}" "${SHELL_HOME}"

运行容器


参考链接:https://blog.csdn.net/Maid_Li/article/details/124952650

在启动docker容器的时候要注意加一些cuda的参数

  • --gpus all-e NVIDIA_VISIBLE_DEVICES=all选择这个容器可见的显卡,直接全部就完事了
  • -e NVIDIA_DRIVER_CAPABILITIES=compute,utility配置了一些cuda必备的包如nvidia-smi之类的
  • 以下为start.sh
#!/usr/bin/env bash#当前脚本路径
SHELL_HOME=$(cd "$(dirname "$0")" || exitpwd
)
source "${SHELL_HOME}"/../dev.conf
source "${SHELL_HOME}"/utilities/rocks.confCONTAINER_NAME="rocksdb-gpu"# work dir inside the dev container
SOURCE_DIR_INSIDE="/home/baum/GPU_ROCKS"
#本地源代码目录 
SOURCE_DIR="/nvme/baum/git-project/GPU_ROCKS"
WORK_DIR=/rocks
RECREATE_CONTAINER=""#我执行的./start.sh -s /nvme/baum/git-project/GPU_ROCKS
function show_usage() {echo "Start a gdb container for Rocksdb.Usage:./start.sh./start.sh -s /path/to/your/cockroachdb/homeOptions:-s                Project path of crdb, default is '${HOME}/go/src/github.com/cockroachdb'.-r                Recreate the dev container.-h                Show this message."exit
}while getopts "s:hr" opt; docase $opt ins)SOURCE_DIR=${OPTARG};;r)RECREATE_CONTAINER="true";;h)show_usage;;*)show_usage;;esac
doneCONTAINER_RUNNING=$(docker container ls | grep "${CONTAINER_NAME}")
CONTAINER_EXISTED=$(docker container ls -a | grep "${CONTAINER_NAME}")if [[ ${RECREATE_CONTAINER} == "true" && -n ${CONTAINER_EXISTED} ]]; thenecho "remove the existing rocksdb-gpu container ..."docker rm -f "${CONTAINER_NAME}"CONTAINER_EXISTED=""
fiecho "current SOURCE_DIR is '${SOURCE_DIR}'"if [[ -z ${CONTAINER_EXISTED} ]]; thenecho "staring the rocksdb-gpu environment 1 ..."#-v 挂载目录,将前一个映射到后一个docker run -it -v "${SOURCE_DIR}":/rocks \-v "${SOURCE_DIR}":${SOURCE_DIR_INSIDE} \--name ${CONTAINER_NAME} \--publish "${ROCKS_PORT}"-"${GDB_PORT}":"${ROCKS_PORT}"-"${GDB_PORT}" \--network=rocksdb-br \--gpus all \-e NVIDIA_DRIVER_CAPABILITIES=compute,utility \-e NVIDIA_VISIBLE_DEVICES=all \--workdir ${WORK_DIR} \"${IMAGE_NAME}:${IMAGE_VERSION}" \bashexit
fiif [[ -z ${CONTAINER_RUNNING} ]]; thenecho "starting rocksdb-gpu environment 2 ..."docker start "${CONTAINER_NAME}"
fiecho "logging into rocksdb-gpu environment '${CONTAINER_NAME}' ..."
docker exec -it "${CONTAINER_NAME}" bash

网络配置


本地16017-16019映射到容器16017-16019

#init-docker-network.sh
#!/usr/bin/env bashSHELL_HOME=$(cd "$(dirname "$0")" || exitpwd
)
source "${SHELL_HOME}"/dev.confecho "create network bridge for rocks ..."
docker network create --subnet="${SUBNET}" "${BRIDGE_NAME}"
docker network list

参考链接:

https://github.com/cnstark/pytorch-docker/blob/main/scripts/build_2.0.1_py3.9.17_cuda11.8.0_devel_ubuntu20.04.sh

https://zhuanlan.zhihu.com/p/544713249

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/108620.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【数据结构】排序--快速排序

目录 一 概念 二 快速排序的实现 1. hoare版本 (1)代码实现 (2)单趟排序图解 (3) 递归实现图解 (4)细节控制 (5)时间复杂度 (6)三数取中优化 2 挖坑法 (1)代码实现 (2)单趟图解 3 前后指针法 (1) 代码实现 (2) 单趟图解 ​编辑4 优化子区间 5 非递归快速排…

FPGA project : flash_write

本实验重点学习了: flash的页编程指令pp。 在写之前要先进行擦除(全擦除和页擦除); 本实验:先传写指令,然后进入写锁存周期,然后传页编程指令,3个地址; 然后传数据&a…

【Java基础面试十五】、 说一说你对多态的理解

文章底部有个人公众号:热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享? 踩过的坑没必要让别人在再踩,自己复盘也能加深记忆。利己利人、所谓双赢。 面试官:说一说你对多态的理解 …

常见6种易被忽略的软件隐藏缺陷

软件隐藏缺陷常常会被测试人员忽略或遗漏,其往往会对项目的成功和用户体验产生不可忽视的负面影响,易造成软件数据泄露、系统崩溃或安全问题等,直接影响系统稳定性和用户满意度。 因此我们需要高度重视软件的隐藏缺陷,重视全面的软…

开源项目汇总

element-plus 人人开源 人人开源 多租户 若依 jeecg https://gitee.com/jeecg/jeecg?_fromgitee_search#https://gitee.com/link?targethttp%3A%2F%2Fidoc.jeecg.com jeeplus JeePlus快速开发平台 j2eefast Sa-Plus

“Flex弹性布局、轮播图mock遍历数据和首页布局解析与实践“

目录 引言1. Flex弹性布局介绍及使用什么是Flex弹性布局?Flex容器与Flex项目Flex属性详解 2. 轮播图mock遍历数据简述轮播图的作用和意义处理mock数据的重要性使用Mock模拟数据遍历 3. 首页布局总结 引言 在现代网页开发中,灵活性和响应式布局是至关重要…

Hadoop知识点+面试题大全

20道面试题及详细解答! 1.说说什么是结构化数据、非结构化数据和半结构化数据 结构化数据、非结构化数据和半结构化数据是根据数据的组织结构和格式来划分的不同类型的数据。 结构化数据:结构化数据是按照预定义的数据模型进行组织和存储的数据。它通常…

linux 查看系统版本

命令:lsb_release -a 可能遇到的问题: 问题1: 报错:command not found: lsb_release原因:系统没有安装 lsb_release解决方案:sudo apt-get install lsb-release 问题2: 报错: Tra…

【C++】--遇到抛异常没有及时释放的空间该怎么办??---智能指针来帮你解决(以及定制删除器)

💖作者:小树苗渴望变成参天大树🎈 🎉作者宣言:认真写好每一篇博客💤 🎊作者gitee:gitee✨ 💞作者专栏:C语言,数据结构初阶,Linux,C 动态规划算法🎄 如 果 你 …

KNN-近邻算法 及 模型的选择与调优(facebook签到地点预测)

什么是K-近邻算法(K Nearest Neighbors) 1、K-近邻算法(KNN) 1.1 定义 如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。 来源:KNN算法最早是由Cover和Hart提…

航天科技×辰安科技 打造智慧化工园区安全保障平台

近年来,国内化工园区安全事故频发,多起化工园区重特大事故造成了严重人员财产损失的同时,也重创了行业的整体发展。在智能制造和工业互联网的背景下,建设智慧化工园区,使用智能化手段实现安全生产是解决当前化工园区安…

uniapp中tabbar导航的点击事件

onTabItemTap : function(e) {console.log(e);// e的返回格式为json对象: {"index":0,"text":"首页","pagePath":"pages/index/index"} },index:点击的序号,从0开始 pagePath&#xff1a…

Vue页面使用Vue3语法

Vue页面使用Vue3语法 HelloWorld.vue <template><h1>{{ msg }}</h1><h1>醒醒&#xff0c;不能犯困&#xff01;</h1><div><h1>次数&#xff1a;{{count}}</h1><button click"dj">点击我&#xff0c;看看什么…

Pruning Pre-trained Language Models Without Fine-Tuning

本文是LLM系列文章&#xff0c;针对《Pruning Pre-trained Language Models Without Fine-Tuning》的翻译。 修剪未微调的预训练语言模型 摘要1 引言2 相关工作3 背景4 静态模型剪枝5 实验6 分析7 结论8 局限性 摘要 为了克服预训练语言模型(PLMs)中的过度参数化问题&#xf…

冲刺十五届蓝桥杯P0005单词分析

文章目录 题目分析代码 题目 单词分析 分析 统计字符串中字母出现的次数&#xff0c;可以采用哈希表&#xff0c;代码采用的是数组来存储字符&#xff0c;将字符-97&#xff0c;得到对应的数组下标&#xff0c;将对应下标的数组&#xff1b;找到数组元素最大的下标&#xff…

Linux C语言

一、基础知识 &#xff08;一&#xff09;冯诺依曼体系 1、存储器&#xff1a;内存 存储程序的思想&#xff1a;按照存储器中指令的顺序 2、存储器的分类 1&#xff09;主存&#xff1a;内存&#xff08;C盘&#xff09; 2&#xff09;外存 3&#xff09;寄存器是cpu内部…

windows常用命令

一.文件操作 dir&#xff1a;查看文件当前路径目录列表 cd .. &#xff1a;返回上一级目录 cd 路径&#xff1a;进入路径

【弃坑xdm】docker容器作为开发环境,更加灵活可靠

关于我准备转行深度学习~~ 弃坑xdm 弃坑xdm 弃坑xdm 转发给你的同学&#xff0c;吓他们一跳~~ ps:其实我准备使用docker容器作为开发环境&#xff0c;vscode可以直接连接docker容器&#xff0c;更加灵活可靠。

日常学习记录随笔-redis实战

redis的持久化&#xff08;rdb,aof,混合持久化&#xff09; redis的主从架构以及redis的哨兵架构 redis的clusterredis 是要做持久化的&#xff0c;一般用redis会把数据放到缓存中为了提升系统的性能 如果redis没有持久化&#xff0c;重启的化数据就会丢失&#xff0c;所有的请…

kafka 相关概念

1 kafka 生产者 kafka 用push的方式把消息推送到topic 每个topic下可以有多个分区&#xff0c; 可以用hash 也可以用轮询的方式指定分区 每个分区内部是可以保证顺序的&#xff0c;但是整体无法保证顺序&#xff0c;除非设置成一个topic只有一个分区。 kafka这种多分区的设置 带…