0%

JPA 和 Mybatis

jpa是一套ORM规范或接口(注意Mybatis没有实现jpa),默认使用Hibernate作为ORM实现,所以一般使用Spring Data JPA即会使用Hibernate。jpa的查询语言是面向对象的而不是面向数据库的。Hibernate是一个ORM框架,它对JDBC进行了非常轻量级的对象封装,将POJO与数据库表建立映射关系,可以自动生成sql语句,使得Java程序员可以从繁琐的sql代码中解脱出来

DAO(数据库访问对象),在jpa里面一般叫做Repository,比如UserRepository;在Mybatis里面一般叫Mapper,比如UserMapper

操作数据库的对象:Hibernate中叫session,jpa中叫entityManager,Mybatis中叫SqlSession

Mybatis

SqlSessionFactory负责创建SqlSession,其作用域应该设置为整个应用,生命周期为应用运行时;SqlSession的实例不是线程安全的,因此不能被共享,所以其作用域是请求或者方法作用域,绝不能将SqlSession实例的引用放在一个类的静态域中,甚至一个类的实例变量都不行。如果处理一个Http请求,打开一个SqlSession,处理完成之后应立即关闭SqlSession,可以放到finally语句中执行

Mybatis支持动态Sql查询,即根据sql语句中前半部分的结果决定是否执行后半部分的查询或者条件
@Mapper注解:我猜这个注解在该mapper被调用时会自动创建一个SqlSession,执行完之后关闭这个SqlSession

Spring data jpa

按照Spring Data JPA的规则自动生成sql语句,无需任何sql语句即可实现CRUD

比如findByNameAndPassword(String name, String password)方法,spring识别findBy作为: “select * from XXX”,sql语句的where部分则是: “where name = :name and password = :password”
参考: https://docs.spring.io/spring-data/jpa/docs/current/reference/html/

矩阵运算

曲面拟合

形如二次多项式:
$f(x, y) = a_{20}x^2 + a_{02}y^2 + a_{11}xy + a_{10}x + a_{01}y + a_{00}$
使用最小二乘法计算系数矩阵a,即使得计算值和真实值之间的误差平方和最小

得到矩阵形如:
$$\left[
\begin{matrix}
x_1^2 & y_1^2 & x_1y_1 & x_1 & y_1 & 1 \
. & . & . & .& . & .\
. & . & . & .& . & . \
. & . & . & .& . & . \
x_m^2 & y_1^2 & x_my_m & x_m & y_m & 1
\end{matrix}
\right]
\left[
\begin{matrix}
a_{20} \
a_{02} \
a_{11} \
a_{10} \
a_{01} \
a_{00}
\end{matrix}
\right] =
\left[
\begin{matrix}
f(x_1, y_1) \
. \
. \
. \
f(x_m, y_m)
\end{matrix}
\right]$$

Read more »

Mxnet训练流程

  • 定义好symbol:符号式编程,生成描述计算的计算图,Symbol API 这个包主要是用于提供神经网络的图和自动求导。使用c++写好的Symbol类,可进行加减乘除等符号运算。

  • 写好dataiter:如果是分布式训练,需要将训练数据平均切分到每台训练的机器上

  • 初始化参数:cpu or gpu、学习率、优化器参数、针对不同网络设置参数初始化方法、验证度量(evaluation metrics)、loss function、callbacks

  • 模型训练:

    • 创建Module:
      1
      2
      3
      4
      mod = mx.mod.Module(symbol=net,
      context=mx.cpu(),
      data_names=['data'],
      label_names=['softmax_label'])
    • mod.fit():
      • mod.bind(): 分配内存,为计算做准备
      • mod.inst_prams(): 初始化module参数
      • mod.init_optimizer(): 初始化优化器,默认sgd
      • mod.metri.create(): 创建evaluation metric
      • mod.forward(): 前向传播计算
      • mod.update_metric(): 更新预测精度
      • mod.backward(): 反向传播,更新计算梯度
      • mod.update(): 更新参数
Read more »

分布式机器学习相关会议

  • 各大机器学习会议上(NIPS, ICML,ICLR)
  • 各大系统会议上(SOSP,OSDI,ATC,EuroSys,SoCC)
  • 应用对应的顶级会议上(CVPR,KDD)

常用的深度学习数据集

  • ImageNet:15 million 带标签的高分辨率224*224的RGB图像,共22,000catagories,1.2TB
  • ImageNet 2012: 1.2 million 带标签的高分辨率224*224的RGB图像,共1,000个分类,138GB;50,000张测试图像,1,000个分类
  • MNIST:输入是28*28是的二值图,输出是0-9这是个数字,60,000 训练图像,10,000测试图像
  • Cifar-10:由60,000张32*32的RGB彩色图片构成,共10个分类。50,000张训练,10,000张测试(交叉验证)

现有的一些分布式深度学习平台

  • 腾讯的Mariana
  • Google的DistBelif
  • 微软的Adam
Read more »

设计架构

Scheduler

k8s的有两步调度策略

  • 预选策略(predicates):强制性规则,遍历所有Node,选择满足要求的Node列表。v1.7支持15种策略
    • PodFitsResources:检查主机资源是否满足pod需求
    • NoDiskConfilict:检查主机上的卷冲突
    • MatchInterPodAffinity:检查pod和其他pod是否符合亲和性规则
  • 优选策略(Priorities):在预选策略的基础上,给Node打分排序,选出最优者。v1.7支持10个策略,每项策略对应一个权重,每项策略的得分乘以权重得到总分
    • ImageLocalityPriority:根据主机上是否已具备Pod运行的环境来打分,得分计算:不存在所需镜像,返回0分,存在镜像,镜像越大得分越高
    • LeastRequestedPriority:计算Pods需要的CPU和内存在当前节点可用资源的百分比,具有最小百分比的节点就是最优,得分计算公式:cpu((capacity – sum(requested)) * 10 / capacity) + memory((capacity – sum(requested)) * 10 / capacity) / 2
Read more »

领域相关

阿里禁用iptables,不用iptables做转发

容器调度相关

  • Google无疑是最有技术敏锐性和市场敏锐性的,早早的看到了Docker企业级市场的企图心,所以Google是第一个支持Docker的竞争对手—-CoreOS的Rocket容器,2014年四月份谷歌风险投资公司牵头对CoreOS进行了1200万美元的投资,目标明确—-对准docker。Google不再是Docker+ kubernetes,而是容器抽象+ kubernetes,即不止支持docker
  • Redhat的OpenShift公有云还是OpenShift V2,V3采用Docker+k8s,很难从V2升级到V3。
Read more »

分布式深度学习系统

  • 模型(model)、参数(parameter)、训练数据(data)都需要分布式并行处理
  • 迭代次数=数据集大小/batchsize,也即batch的数目;每轮迭代前,worker会从ps pull最新的参数
  • 一轮迭代过后,即训练完一个batch后,做反向传播、参数更新

《More Effective Distributed ML via a Stale Synchronous Parallel Parameter Server》(NIPS’13)

本文基于Parameter Server模型提出SSP(Stale Synchronous Parallel)模型,解决异步训练中会出现同步问题。主要思路是在每个worker本地建立一个cache,存储参数,worker从本地cache读取参数而不是向ps请求参数,这样减缓了worker等待参数更新的时间。而本地cache的参数与ps的同步则单独处理。

SSP在同步和异步之间进行了折中,以兼顾quality和quantity。即每个worker在迭代的时候都有一个clock counter,记录当前迭代到哪一步了,给定一个阈值s,SSP满足以下规则:

  • 最快worker和最慢worker之间相差的迭代步不能超过s,否则最快的迭代步将强制等待最慢的worker。
  • 一个clock为c的worker提交一个更新的时候,这个更新的时间戳就是c。
  • 当一个clock为c的worker从cache读取一个更新的时候,它读取的参数更新最坏也是c-s-1时间戳之前所有的参数。
  • 一个worker读取的更新总会比自己产生的所有结果更新。

当s=0时,就是完全同步;当s等于无穷大时,就是完全异步。

Read more »

使用kubeadm安装kubernetes

预备条件

  • /etc/hosts文件
  • 关闭firewall
  • 关闭selinux
  • 关闭swap
  • iptables参数
    1
    2
    3
    4
    5
    6
    7
    $ cat <<EOF >  /etc/sysctl.d/k8s.conf
    net.bridge.bridge-nf-call-ip6tables = 1
    net.bridge.bridge-nf-call-iptables = 1
    net.ipv4.ip_forward = 1
    EOF

    $ sysctl --system
    Read more »

DC上配置elasticsearch

配置node-master

  • 在n125上,新建/etc/elasticsearch/elasticsearch.yml
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    cluster.name: elasticsearch_cluster
    node.name: node-master
    node.master: true
    node.data: true
    http.port: 9200
    transport.tcp.port: 9300
    transport.type: netty3
    http.type: netty3
    network.host: 0.0.0.0
    network.publish_host: esmaster.elsearch.crawl-mesos-project.menya.marathon.mesos
    discovery.zen.ping.unicast.hosts: ["esmaster.elsearch.crawl-mesos-project.menya.marathon.mesos:9300"]
    discovery.zen.ping_timeout: 3s
  • 新建/data/crawl-es-data目录
  • 执行sysctl -w vm.max_map_count=262144将机器的vm.max_map_count调高一些
  • DC上创建service,id为menya/crawl-mesos-project/elsearch/esmaster,网络类型选择VirtualNetwork,指定镜像并根据官方镜像说明,传入一些环境变量
  • 运行service
Read more »

Cgroups

安装libcgroup (yum install libcgroup)

  • 一个css_set关联多个 cgroups 层级结构的节点时,表明需要对当前css_set下的进程进行多种资源的控制。而一个 cgroups 节点关联多个css_set时,表明多个css_set下的进程列表受到同一份资源的相同限制。
  • cgroups 也是通过 VFS 把功能暴露给用户态的,cgroups 与 VFS 之间的衔接部分称之为 cgroups 文件系统。VFS本身就是用 c 语言实现的一套面向对象的接口。
  • Linux中,用户可以使用mount命令挂载 cgroups 文件系统
Read more »