近期一直在用torch的分布式训练,本文调研了目前Pytorch的分布式并行训练常使用DDP模式(Distributed DataParallell
),从基本概念,初始化启动,以及第三方的分布式训练框架展开介绍。最后以一个Bert情感分类给出完整的代码例子:torch-ddp-examples。
PyTorch中NLLLoss|CrossEntropy|BCELoss记录
在分类任务中,有几个常用的损失函数,包括NLLLoss, CrossEntropy
以及BCELosss
,内容比较基础, 这里以pytorch的函数为例,回顾下细节和使用方法作为记录。
NLLLoss
docker部署Flask+MongoDB+Nginx
近期需要将一个Flask+MongoDB+Nginx 小系统打包部署,之前只用过docker对简单的代码进行打包,这次使用docker-compose踩了很多坑,特此记录下。主要参考这篇详细的指南How To Set Up Flask with MongoDB and Docker {建议细看}。
Bert/ELMo文本分类小实验
最近重新梳理了下Transformer和Bert的一些基本原理和概念,再加上之前做过关于ELMo的测试,于是这次就把Bert加进去,相对完整地在文本分类这任务上对不同的预训练词向量以及不同的编码器等做了简单的对比实验,代码如下Bert/ELMo文本分类 ,使用Pytorch框架完成。
python使用futures进行并行处理
很多时候任务都需要并行,比如IO密集型的爬数据,读写磁盘等,CPU计算密集型的计算任务等等。而Python由于GIL的原因,默认情况下只能单线程运行,无法直接利用硬件的多核多线程,因此效率较低,python也早提供了一些列的多线程多进程的库可以用来使用,比如multiprocessing, queue 等等, 不过使用起来都相对复杂,不易控制。 经过几番尝试调研尝试,发现futures
基本是最方便将单线程/进程代码改为并发的代码的一个模块。
这篇博客主要是简单记录下futures最常用的方式,以方便后续使用。
基于评论文本的深度推荐系统总结
本文主要总结下近几年结合评论文本的推荐系统 (review-based recommendation),侧重深度学习的模型,并且开源了一个代码库: Neu-Review-Rec 主要完成了数据处理,模型构建,baseline复现等完整的Pipeline。[长文预警]
推荐系统结合知识图谱简单总结
对近几年推荐系统(Recommendation System)领域结合Knowledge Graph Embedding (知识图谱表示学习) 或者 Network Embedding(网络表示)的几篇论文做了极简介绍。 首先对简单介绍推荐系统,之后整理了几篇结合知识表示的论文。
推荐系统简介
Bert/ELMo词向量及使用方法记录
2020.07.04更新: 加入使用Transformers的Bert的例子,见github: pytorch-bert-elmo-example
2019.4.3更新:新增使用AllenNLP的ELMo做文本分类的例子说明:详见github: Pytorch-ELMo
Bert/ELMo不同于word2vec、glove,属于上下文词向量模型, 可以很方便用于下游NLP任务中。
- ELMo基于LSTM, 来自《Deep Contextualized Word Representations》
- Bert基于Transformer, 来自《BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding》
Factorization Machine笔记及Pytorch 实现
简介
Factorization Machine(因子分解机)是Steffen Rendle在2010年提出的一种机器学习算法,可以用来做任意实数值向量的预测。对比SVM,基本的优势有:
- 非常适用与稀疏的数据,尤其在推荐系统中。
- 线性复杂度,在large scale数据里面效率高
- 适用于任何的实数向量的预测任务,包括:
- 回归
- 分类
- 排序
docker搭建neo4j与elasticsearch数据同步
需求
现在有图数据,包含节点和边,节点或者关系都有大段的文本属性,并且需要对全文文本进行检索,因此计划使用Neo4j 进行关系存储以及图算法的应用,使用Elastic Search 进行全文搜索,因此需要Neo4j的数据与Elastic Search进行自动同步,从而实现节点/关系搜索使用Neo4j, 全文搜索使用Elastic Search, 各发挥自己的长处。
方案
正巧的Neo4j官方提供了一个插件neo-elasticsearch, 可以直接Neo4j的数据实时同步到ElasticSearch中。 不过由于官网文档的说明比较简单,以及本人对docker的熟练度有限,在使用docker搭建的过程中,遇到了很大的坑,记录于此。
Ubuntu常用代理设置方法
使用Tinyproxy 在一台可以连接公网的机器上搭建了代理,这样可以让内网机器可以连接通过连接该代理,访问外网资源。 不过很多常用的应用或者命令的代理方式不一致。因此总结一下:
环境变量设置
可以直接在命令行: export http_proxy=http://ip:port
. 或者在.bashrc
里面加入这一行可以一直生效。 这个可能对于某些命令有效。对于sudo操作,需要在sudo之后加-E
APT系列
包含apt update/intall/upgrade
等, 一般使用选项设置代理,如:
1 | sudo apt -o Acquire::http::proxy="http://ip:port" update |
或者使用-c 写到文件 apt_proxy.conf
,内容:
1 | Acquire::http::proxy="http://ip:port" |
这样就可以这样使用代理:
1 | sudo apt -c ~/apt_proxy.cong update |
不过有一些命令可能还需要单独设置:
apt-key adv
添加key的时候, 这时候需要用专门的代理选项1
sudo apt-key adv --keyserver-options http-proxy=http://ip:port/ --keyserver keyserver.ubuntu.com --recv-keys XXXXX
ADD-APT-REPOSITORY
添加源的时候,因为一般是sudo
权限所以即使设置了环境变量,也不能生效,这时候需要用-E
选项这个也属于一种通用的方式,1
sudo -E add-apt-repository XXXX
sudo -E
表示使用当前用户的环境变量。
Docker
这个直接按照官网教程来即可: https://docs.docker.com/config/daemon/systemd/#httphttps-proxy
- 创建一个服务目录:在
/etc/systemd/system/
下:1
sudo mkdir docker.service.d
- 在
docker.service.d
目录下新建一个http-proxy.conf
的文件, 写入如下的内容1
2[Service]
Environment="HTTP_PROXY=http://ip:port/" - 当然如果有内网的Docker仓库,也可以设置不走代理的名单,只需在后面加上即可,如:
1
2[Service]
Environment="HTTP_PROXY=http://proxy.example.com:80/" "NO_PROXY=localhost,127.0.0.1,docker-registry.somecorporation.com" - 刷新系统配置:
sudo systemctl daemon-relaod
- 重启docker
sudo systemctl restart docker
- 查看验证docker的配置:
systemctl show --property=Environment docker
maven代理
修改setting.xml
文件,一般位于~/.m2/setting.xml
或者 maven安装目录下的/conf/setting.xml
, 修改如下信息(去掉注释):
1 | <proxy> |
其中,上述选项有的可选,没用的直接删除即可:
pip代理
直接使用--proxy
选项: 1
sudo pip --proxy 127.0.0.1:8888 install XXXX