SmileTM博客

_________Smile To Me

Tensorflow distribute

Tensorflow2.0 单机多卡设置。

Tensorflow2.0 多GPU设置。

在Tensorflow2.0 中,有一个非常一个非常方便的函数 tf.distribute.MirroredStrategy()只需在代码中进行修改即可。

我们可以简单理解 单机多卡,就是将数据根据batch进行分发到每一张GPU上,然后单独计算loss,最后对loss进行汇总,然后进行反向传播,对每张GPU上的模型参数镜像 进行更新。

MirroredStrategy 的步骤如下:

  • 训练开始前,该策略在所有 N 个计算设备上均各复制一份完整的模型;

  • 每次训练传入一个批次的数据时,将数据分成 N 份,分别传入 N 个计算设备(即数据并行);

  • N 个计算设备使用本地变量(镜像变量)分别计算自己所获得的部分数据的梯度;

  • 使用分布式计算的 All-reduce 操作,在计算设备间高效交换梯度数据并进行求和,使得最终每个设备都有了所有设备的梯度之和;

  • 使用梯度求和的结果更新本地变量(镜像变量);

  • 当所有设备均更新本地变量后,进行下一轮训练(即该并行策略是同步的)。

其中,最主要的 就是下面3个函数。

1
2
3
4
5
6
7
8
# 创建strategy
strategy = tf.distribute.MirroredStrategy()

# 将train_step 分发到各个GPU, 并得到各GPU返回的句柄
loss = strategy.experimental_run_v2(train_step, args=(None,))

# 根据返回的句柄,将各GPU计算的loss进行汇总
strategy.reduce(tf.distribute.ReduceOp.SUM, loss, axis=None)
阅读全文 »

Build tensorflow/addons with custom cuda/cudnn version

There have four steps to “Build tensorflow/addons with custom cuda/cudnn version”.

your can use conda to duild.

1
2
conda create -n mk
conda activate mk
阅读全文 »

本文根据 Luong 论文中NMT的的一个注意力例子来进行 中-英 NMT模型的构建训练,并对该训练后的模型在Docker上进行部署。具体的可以参考Tensorflow教程NMT_with_Attenion,本文也是根据该教程来对Docker部署进一步探索。

NMT_with_Attenion也是NLP中比较经典的值得复现的一个例子。

本文架构

  • Model

  • Train

  • Save model

  • Deploy

阅读全文 »

Tensorflow在部署上也提供的许多多方便的方法。其中最为方便的,就是通过Docker+Tensorflow_Serving 进行部署。在这里仅仅只对docker + tensorflow/serving + rest api 进行简单介绍。

阅读全文 »

混淆矩阵、准确率、精确率、召回率、F值、ROC曲线、AUC、PR曲线-Sklearn.metrics评估方法

混淆矩阵

  • TN :真实为0,预测为0
  • FP :真实为0,预测为1
  • FN :真实为1,预测为0
  • TP :真实为1,预测为1
混淆矩阵 预测
0 1
真实 0 TN FP
1 FN TP
阅读全文 »

在TF2中保存加载模型,有多种方式。下面介绍下,最主要的几种方式,以及在模型中有Custom Layer时如何保存和加载模型。

由于Google官方在有Custom Layer层 的模型 保存/加载 介绍的非常不全面。这里统一详细介绍下。

阅读全文 »

Tensorflow2.0-gpu 的安装的复杂早有耳闻,以前一直用的都是cpu版,一直通过conda一键安装,过于安逸。

哎,欠的账始终是要还的。

最近,接触到实验室服务器后,开始捣鼓Tensoflow2.0-GPU,才发现各种神坑。
首先因为学校服务器都是共享的无法获取root权限,导致无法更新显卡驱动,使得cuda10 ,无法安装。于是只能安装cuda9 。然后问题来了,google只提供了Tensorflow2.0-GPU cuda10的版本。通过Google发现有人也提了这个问题How to install tensorflow2.0 in cuda9? 。问题中的解决方案是 通过Tensoflow2.0的源码 在cuda9上重新编译就行了。因为Google提供的是基于cuda10编译的,并不能找到cuda9。

好了,有了解决方案本以为会很容易,结果又碰见权限问题。因为没有root权限,开始安装bazel编译工具时碰见了麻烦。记得以前看conda list时看见过bazel,于是Google了发现conda确实可绕过 root权限 进行bazel的安装 而且conda还会自动的帮你把bazel所需的 jdk一起安装,真的安逸。本以为会很顺利,结果编译了30分钟后,开始报错,提示该环境下没有找到keras-preprocessing ,keras-applications,numpy。(通过conda专门搭建的编译环境一时疏忽,只安装了bazel,别的都忘了安。)QAQ 白瞎了30分钟。

所有依赖的包安装好后,重新开始编译,32线程开工,花了大约1个小时。

阅读全文 »

Custom layers

自定义成层只需要 继承tf.keras.layers.Layer 类即可:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class MyDense(tf.keras.layers.Layer):
# init 可以进行所有与输入无关的初始化
def __init__(self,units =32):
super(MyDense, self).__init__()
self.units = units
# build 可以知道输入张量的形状,并可以进行其余的初始化
def build(self, input_shape):
self.w1 = self.add_weight(shape=(input_shape[-1], self.units),
initializer=tf.keras.initializers.he_normal(),
trainable=True)
self.b1 = self.add_weight(shape=(self.units),
initializer=tf.keras.initializers.zeros(),
trainable=True)
# 在这里进行正向计算
def call(self, inputs):
return inputs@self.w1+self.b1
阅读全文 »

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import tensorflow as tf
import numpy as np
import pandas as pd
from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.preprocessing.sequence import pad_sequences

# 利用pandas 读取csv文件数据
data = pd.read_csv('./bbc-text.csv')
# 将data转换为numpy数据
data = data.to_numpy()
# 对数据进行提取
labels = data[:, 0]
sentences = data[:, 1]
# 创建分词器

# 这里设置分词器容量为100, 若超过100 则剩余的用<oov> 表示
# stokenizer = Tokenizer(100,oov_token='<oov>')

stokenizer = Tokenizer()
stokenizer.fit_on_texts(sentences)

# 输出词 词索引
word_index = stokenizer.word_index
print(word_index)

# 将文本转换为相应的 序列
sequences = stokenizer.texts_to_sequences(sentences)
print(sequences[0])

# 将小于指定长度的文本序列进行 0 填充,默认为前面填充,可用参数有padding = ‘post’/'pre',truncating = 'post'/'pre'
# pad_sequences(sequences, padding=None,truncating=None)
padded = pad_sequences(sequences)


print(padded[0])

输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
举例
sentences = ['i love you','do you have money', 'i like running']

word_index
{'i': 1, 'you': 2, 'love': 3, 'do': 4, 'have': 5, 'money': 6, 'like': 7, 'running': 8}

sequences
[[1, 3, 2], [4, 2, 5, 6], [1, 7, 8]]

padded 默认以最长句子为Maxlen ,在序列前面填充
[[0 1 3 2]
[4 2 5 6]
[0 1 7 8]]

ImageDataGenerator

本文章介绍了,直接通过Tensorflow 的ImageDataGenerator 来直接根据相应文件所在的标签目录 进行加载数据,并自动根据文件夹名字 进行自动分类,避免了人工进行标注。

阅读全文 »
0%