2020年2月

加源 rpm -Uvh https://repo.mysql.com/mysql80-community-release-el7-3.noarch.rpm

yum install mysql-conmunity-server
grep "A temporary password" /var/log/mysqld.log

但是似乎在我这不起作用,并看不到临时登录密码。
考虑尝试MySQL通用的暴力登录法重置密码:

service mysqld stop
mysqld --user mysql --skip-grant-table &
mysql -uroot

进去以后先执行FLUSH PRIVILEGES;,把权限管理加载回来,然后再用ALTER USER root IDENTIFIED BY 'your_password'修改密码。
然后可能会遇到密码修改失败的问题,这是因为MySQL8中使用了更为严格的默认密码策略。
可参见官方文档https://dev.mysql.com/doc/refman/8.0/en/validate-password-options-variables.html。
查看当前策略使用命令SHOW VARIABLES LIKE 'validate_password.%'; 修改的话使用set global key=val;格式的语句可以修改对应的设置。 完了之后记得killall mysqld,等一会之后用service或者systemctl重启mysqld。之前的操作会使得任何人可以直接免密登录mysql的。

是的,铁头娃又来了

平台:CentOS 7.7

sudo yum groupinstall "Development Tools"

有的Gemfile会影响某些gem包的行为,比如在不同目录下执行同一命令,发现包版本不同。 随着gem的版本,会有固定的默认功能包(好像也叫gem?)版本,更改方法是改变gem版本。

装postgresql的时候要记得装postgresql-contrib,有用到的extension在这个包里提供。 gem和go有的时候记得换源,不然速度太慢。

  1. git要升级
  2. ruby要升级,而且最好是2.5.3,版本太高一堆警告
  3. postgresql > 9.4
mkdir -p /var/cache/swap
cd /var/cache/swap
dd if=/dev/zero of=myswap bs=1M count=2048
mkswap myswap
chmod 600 myswap
# 在/etc/fstab中添加一行:/var/cache/swap/myswap swap swap defaults 0 0

yum update -y
# 一键安装gcc等开发工具
yum groupinstall "Development Tools" -y

# nodejs 10源
curl -sL https://rpm.nodesource.com/setup_10.x | bash -
# yarn源
curl --silent --location https://dl.yarnpkg.com/rpm/yarn.repo | sudo tee /etc/yum.repos.d/yarn.repo
yum install yarn node -y

# 更新ruby
wget https://cache.ruby-lang.org/pub/ruby/2.5/ruby-2.5.7.tar.gz
tar xzf ruby-2.5.7.tar.gz
cd ruby-2.5.7
./configure --enable-shared --prefix=/usr # 直接覆盖老版本
make -j2 && make install # 因为是2核vcpu

# 更新git
wget https://mirrors.kernel.org/pub/software/scm/git/git-2.21.1.tar.gz
tar xzf git-2.21.1.tar.gz
cd git-2.21.1
./configure --prefix=/usr # 直接覆盖老版本
make -j2 && make install

# 安装postgresql
# 可以到这里自定义rpm源:https://www.postgresql.org/download/linux/redhat/,也可以下载源码自行编译
yum install https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm -y
yum install postgresql12 -y

如果postgresql没有正常工作,可能是没有自动初始化,参考这里:https://www.postgresql.org/docs/12/install-short.html

然后继续

# 创建gitlab用户
adduser git -d /home/git

# clone项目,选择自定义分支
su git
cd ~
git clone https://gitlab.com/gitlab-org/gitlab-foss.git gitlab
git checkout 11-11-stable-patch-2

# 接下来记得参考*对应分支*的安装文档进行操作
# 比如本分支:https://gitlab.com/gitlab-org/gitlab-foss/-/blob/11-11-stable-patch-2/doc/install/installation.md

参考OpenMPI的文档

Rank可以理解为进程的编号。

CUDA里最基本的线程逻辑结构是顺序的,像一维数组一样,有一个连续递增的线程号(threadIdx.x),且总线程数是线程可知的(blockDim.x)。
MPI也有这两个特性(事实上MPI(1991)要先于CUDA(2007),而我只是恰好先了解的CUDA),不过命名...就没有CUDA那么友好了:使用MPI_Comm_size(...)获取总进程数,通常记为comm_sz这不说谁看得懂啊;使用MPI_Comm_rank获取当前进程编号,通常记为my_rank。这种表记方式来自Peter S. Pacheco的《并行程序设计导论》。

MPI_Init(int *argc, char ***argv)在调用任何MPI函数前调用,类似于初始化的作用

MPI_Send()阻塞性函数,对面不接受就一直阻塞

MPI_Sendrecv(const void *sendbuf, int sendcount, MPI_Datatype sendtype,
    int dest, int sendtag, void *recvbuf, int recvcount,
    MPI_Datatype recvtype, int source, int recvtag,
    MPI_Comm comm, MPI_Status *status)

由于MPI_SendMPI_Recv是阻塞性函数,由于线程竞争或者不恰当的程序逻辑很容易导致死锁,MPI_Sendrecv可以解决这个问题:同时进行发送和接收消息两个动作。

参数依次是: 发送区域起始地址 / 发送数据数量 / 发送数据类型
(向...发送数据的)目标进程编号 / (似乎是)发送的消息编号 / 接收区域起始地址 / 接收数据最大数量
接收数据类型 / (从...接收数据的)源进程编号 / (似乎是)想接收的消息编号
(MPI通讯器?不清楚) / (MPI状态?不清楚

关于Sendrecv这个博客的例子比较简洁易懂。
没仔细看,先丢在这里,关于send/recv tag的:https://stackoverflow.com/questions/31386659/when-to-use-tags-when-sending-and-receiving-messages-in-mpi

MPI_Finalize()(尚不清楚是否一定要求调用)清除进程中所有的MPI状态量,类似于退出MPI环境,在该进程中,之后MPI的函数库中只能调用MPI_Get_version, MPI_Initialized, MPI_Finalized三个函数。

问题出在CMake上。作者在写CMake脚本时使用了perl,这个工具在Linux发行版一般会自带(太常用了),但是Windows就没有。粗略看了一下,做了的工作至少包括了调用objcopy,这也恰好是出现LNK2017的原因,明明读取到了openblas.obj但是找不到符号。

解决方案一目了然,给Windows平台上安装perl环境即可。个人解决方案是直接借用了texlive里的tlperl包,可以成功完成任务。

翻车历史见这里

我胡汉三又回来了!!

编译的版本是Tensorflow 1.14。

为什么不用2?因为据说API大改,一堆坑。
像我这种改别人代码跑跑的肯定用不得

这次遇到的问题:

  1. 需要按照要求装MSYS,并且要使用MSYS2环境而不是MinGW环境(Github for Windows提供了MinGW,但是没有pacman);
  2. 记得适当修改bazel的缓存位置(真香),每次运行命令时使用选项--output_user_root,避免把缓存写在叠瓦技术(SMR)的机械硬盘上,那速度慢得爽的飞起;
  3. LLVM更新速度过快,而且现在已经更改项目名为llvm-project(之前是llvm),尽量使用和tensorflow发布时间相近的LLVM快照(时间过久会失效,但这不像Github的风格啊= =),在${PROJECT_ROOT}/tensorflow/workspace.bzl中可以找到并修改引用的LLVM版本;
  4. 截至Tensorflow 1.14和本文撰写时(2020/2/8),XLAnccl是不支持Windows平台或者支持的不是很好的(不折腾的话,几乎无法编译成功),不建议启用这两个特性;
  5. (某些特殊版本)需要修改${PROJECT_ROOT}/.bazelrc中,把build:cuda--define=using_cuda_nvcc=true注释掉,因为在Windows平台上不能使用--config=nonccl选项取消使用nccl,会报错;
  6. 有时候会遇到error C2993: 'Derived': 非类型模板参数 '__formal' 的不合法类型。在pytorch的issues里找到了类似的问题,说是由于依赖关系和多线程编译竞争带来的问题,设置为单线程编译--jobs 1可以解决问题(未测试):https://github.com/pytorch/pytorch/issues/25393

=============================================================

20200216补充

算了,放弃了,一直说是Eigen有问题,好像是关于GPU设备代码上找不到std::conj定义一类的问题。这几天网上冲浪的时候发现风评CUDA nvcc对于STL的支持很差,可能与这个有关。但是有dalao硬是编译出来了,就很不服气。在个人笔记本上编译特别浪费时间,1-2h起步,而且从来没成功过= =。等这波病情过去,借到好点的CPU资源再说吧。