被吊打的没有尊严的第N天
ubuntu 安装docker & nvidia-docker
#!/bin/sh
#安装docker
sudo apt-get install docker docker-io
#安装NVIDIA-docker
wget https://github.com/NVIDIA/nvidia-docker/releases/download/v1.0.1/nvidia-docker_1.0.1-1_amd64.deb
sudo dpkg -i /tmp/nvidia-docker_1.0.1-1_amd64.deb
#testing
sudo nvidia-docker run --rm nvidia/cuda nvidia-smi
#这个test通过之后基本说明nvidia-docker安装成功,不过不一定能用
centos 安装docker & nvidia-docker
#安装docker
sudo yum install docker docker-io
#安装NVIDIA-docker
wget https://github.com/NVIDIA/nvidia-docker/releases/download/v1.0.1/nvidia-docker-1.0.1-1.x86_64.rpm
rpm -ivh nvidia-docker-1.0.1-1.x86_64.rpm
#testing
sudo nvidia-docker run --rm nvidia/cuda nvidia-smi
关于docker的问题就来了,装完发现有几率不能运行,其实这不是装的不对,而是有些系统需要手动启动(怀疑是因为没有重启)
#重启nvidia-docker服务
sudo systemctl restart nvidia-docker
#当然也可以重启docker服务
sudo systemctl restart docker
除了这个小问题之外,还有可能遇到的nvidia-docker启动不成功的情况,有诸如此类的错误的。
“legacy plugin: plugin not found”
nvidia-docker | 2018/11/01 10:20:17 Error: Could not load UVM kernel module. Is nvidia-modprobe installed?
#安装以下包估计就已经没有更多错误了
sudo apt-get install nvidia-modprobe
#暂时只踩到这么多坑
docker 删除所有none镜像
docker rmi $(docker images | grep "none" | awk '{print $3}')
对于可能遇到的一种情况:使用nvidia-docker启动时报出本地没有镜像,但docker可以启动。这种情况是由于nvidia-docker需要使用一个数据卷容器,本地环境中没有该数据卷容器。解决办法为:
docker volume create --name=nvidia_driver_418.67 -d nvidia-docker
#如果该语句运行失败。重启nvidia-docker和docker服务。
systemctl restart docker/nvidia-docker
生成一个可以使用GPU的docker镜像的dockerfile代码。其中包含安装了必要的Python库,protobuf库,
FROM ubuntu:16.04
#这个环境变量有点讲究,安装某些库的时候需要交互确认,但交互之后就会卡死,该环境变量会避免这种交互
ENV DEBIAN_FRONTEND=noninteractive
#有时候某些update失败不影响打包,可以用exit去防止失败退出
RUN apt-get update; exit 0
RUN apt-get install -y \
build-essential \
make \
unzip \
wget \
python3-dev python3-pip \
vim \
git \
libssl-dev \
zlib1g-dev \
libbz2-dev \
libreadline-dev \
libsqlite3-dev \
curl \
llvm \
libncurses5-dev \
xz-utils \
tk-dev \
libxml2-dev \
libxmlsec1-dev \
libffi-dev \
liblzma-dev \
python-numpy \
&& rm -rf /var/lib/apt/lists/*
RUN wget http://github.com/protocolbuffers/protobuf/releases/download/v3.5.1/protobuf-all-3.5.1.tar.gz \
&& tar xf protobuf-all-3.5.1.tar.gz \
&& cd protobuf-3.5.1 \
&& ./configure CXXFLAGS="-D_GLIBCXX_USE_CXX11_ABI=0" --prefix=/usr \
&& make install \
&& cd .. \
&& rm protobuf-all-3.5.1.tar.gz protobuf-3.5.1 -r
ENV PYENV_ROOT=/opt/pyenv \
PATH=/opt/pyenv/shims:/opt/pyenv/bin:$PATH \
CAFFEPATH=/opt/python/caffe
ENV PYTHONPATH=/opt/python:$PYTHONPATH
ENV LD_LIBRARY_PATH=$CAFFEPATH:/usr/local/lib:$LD_LIBRARY_PATH
RUN git clone --depth 1 https://github.com/pyenv/pyenv.git /opt/pyenv \
&& eval "$(pyenv init -)" \
&& env PYTHON_CONFIGURE_OPTS="--enable-shared" pyenv install 3.6.4 \
&& pyenv global 3.6.4
RUN pip install protobuf==3.5.1 cmake numpy
ENV DDK_HOME=/opt/ddk
#RUN mkdir -p /dep && cd /dep \
# && wget _____ -O caffe_cpu.tar \
# && mkdir -p /opt/python \
# && tar -xvf caffe_cpu.tar -C /opt/python \
# && wget ${NART_URL} -O nart-0.2.1-py3-none-any.whl \
# && pip install nart-0.2.1-py3-none-any.whl \
# && cd / && rm -rf /dep
#重要的是一下的关于GPU的环境变量的设置
ENV CUDA_VERSION 10.0.130
ENV NVIDIA_VISIBLE_DEVICES=all
ENV NVIDIA_DRIVER_CAPABILITIES=compute,video,utility
ENV NVIDIA_REQUIRE_CUDA "cuda>=10.0"
LABEL com.nvidia.volumes.needed="nvidia_driver"
LABEL com.nvidia.cuda.version="${CUDA_VERSION}"
#拷贝CUDA10、cudnn、tensorRT库
COPY ./cuda-10.0 /usr/local/cuda-10.0
COPY ./trt/trt5_lib /opt/trt5_lib
COPY ./cudnn /opt/cudnn
ENV PATH=/usr/local/nvidia/bin:/usr/local/cuda/bin:$PATH
ENV LD_LIBRARY_PATH=/usr/local/nvidia/lib:/usr/local/nvidia/lib64:/opt/cudnn:/opt/trt5_lib:$LD_LIBRARY_PATH:/usr/local/cuda-10.0/lib:/usr/local/cuda-10.0/lib64:
git 系列
添加子模块
git submodule add ${url} ${path}
#其中url为git仓库地址,path为submodule存放地址
删除子模块
删除是一个很不人性化的操作,此处dis一下git开发者
- 先删除.gitsubmodule下相关的子模块
- 再删除.git/config下的相关子模块
- 删除git子模块缓存git rm --cached ${submodule_path}
更新submodule的URL操作基本也和删除一样的操作
- 先修改.gitsubmodule下相关的子模块的URL
- 再修改.git/config下的相关子模块的URL
- git submodule sync
git submodule切换分支或者版本
cd ${submodule_path}
git pull
git checkout ${commit_id}
#有时候需要git checkout --hard ${commit_id}. 回退之前版本更是需要用reset而不是checkout
git 覆盖前一个commit。
因为有时候由于一点小小的修改做了一些无用的commit,造成git tree很丑陋,所以一些尝试性的commit可以覆盖前一次,减少分支上可见的commit。
#add 操作是一样的
git add -A
#commit有所不同
git commit --amend
#推向远程仓库时也不一样。值得注意的是,在多人合作的分支上最好不要或者谨慎这样操作,被队友打是小事,
#酿成大祸可能就只能跑路了。最后丢工作又丢老婆
git push origin HEAD:refs/heads/0.9.0 --force
#正常push是不需要--forse的……
git 修改默认编辑器
git config --global core.editor vim
git config --global core.editor code #比如说你想用vscode写commit信息
git删除远程分支
git push origin --delete dev #删除dev分支
git branch -d dev #删除本地dev分支
git打tag
tag就是对某一个时间点的代码打上标签,以后他也不会变,标签对应的代码永远是这一刻的
git tag -a v1.4 -m 'my version 1.4'
#把tag推给远程
git push origin ${tag_name}
CPP
关于const
const的基本理念就是修饰一个对象,使其无法被修改。
基于这一个理念,const的用法可以产生出神出鬼没的变化。我觉得这也是CPP的魅力所在。(学好CPP真是一件不可能的事情)
- const用法一
修饰变量,当然被const修饰的变量应该叫做常量。不可修改,只能使用。效果与C的宏是一样的。 - const用法二
修饰指针。实际上对于一个对CPP有初步了解的人来说,不应该用有色眼镜来看指针,因为他也是变量,应该一视同仁。待续…