使用 Jindo Tensorflow Collector 访问 OSS/OSS-HDFS§

Jindo Tensorflow Collector 支持使用 Tensoflow 原生 API 支持访问 OSS/OSS-HDFS。

1. 下载 JindoSDK 包§

下载最新的 tar.gz 包 jindosdk-x.y.z.tar.gz(x.y.z表版本号), (下载页面)。

部署方式,参见部署文档

2. 修改配置§

2.1 安装 tensorflow§

目前仅支持 tensorflow 1.15 或 tensorflow 2.8 版本,以下以 tensorflow 2.8 为例。

pip3 install tensorflow==2.8

2.2 添加环境变量§

2.2.1 JindoSDK 环境变量§

确认 LD_LIBRARY_PATH 包含 /path/to/jindosdk-x.x.x/lib/native

2.2.2 依赖的 Tensorflow 环境变量§

同时,LD_LIBRARY_PATH 需要添加 tensorflow 所在的依赖路径,不同的 python 环境安装路径可能不同,如:

# tensorflow1.15
export LD_LIBRARY_PATH="/usr/local/lib/python3.9/site-packages/tensorflow/":$LD_LIBRARY_PATH
# tensorflow2.8
export LD_LIBRARY_PATH="/usr/local/lib/python3.9/site-packages/tensorflow/":$LD_LIBRARY_PATH

2.3 配置文件§

使用 INI 风格配置文件,配置文件的文件名为jindosdk.cfg。可以选择固定或者免密两种配置方式。

2.3.1 固定 AK 访问§

示例如下:

[common]
logger.dir = /tmp/tfio-log

[jindosdk]
# 已创建的Bucket对应的Endpoint。以华东1(杭州)为例,填写为oss-cn-hangzhou.aliyuncs.com。
fs.oss.endpoint = <your_endpoint>
# 用于访问OSS的AccessKey ID和AccessKey Secret。阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
fs.oss.accessKeyId = <your_key_id>
fs.oss.accessKeySecret = <your_key_secret>

配置选项§

配置项 默认值 配置节 说明
logger.dir /tmp/tfio-log common 日志目录,不存在会创建
logger.sync false common 是否同步输出日志,false表示异步输出
logger.consolelogger false common 打印日志到终端
logger.level 2 common 输出大于等于该等级的日志。
开启终端日志时,日志等级范围为0-6,分别表示:TRACE、DEBUG、INFO、WARN、ERROR、CRITICAL、OFF。
关闭终端日志,使用文件日志时:日志等级<=1,表示WARN;日志等级>1,表示INFO。
logger.verbose 0 common 输出大于等于该等级的VERBOSE日志,等级范围为0-99,0表示不输出
logger.cleaner.enable false common 是否开启日志清理
fs.oss.endpoint jindosdk 访问 OSS-HDFS 服务的地址,如cn-xxx.oss-dls.aliyuncs.com
fs.oss.accessKeyId jindosdk 访问 OSS-HDFS 服务需要的 accessKeyId
fs.oss.accessKeySecret jindosdk 访问 OSS-HDFS 服务需要的 accessKeySecret

更多 jindosdk 配置节参数可见相关文档

2.3.2 免密访问§

前提:使用的是阿里云 ECS,并且该机器已绑定过角色授权。 示例如下:

[common]
logger.dir = /tmp/tensorflow-log

[jindosdk]
# 已创建的Bucket对应的Endpoint。以华东1(杭州)为例,填写为oss-cn-hangzhou.aliyuncs.com。
fs.oss.endpoint = <your_endpoint>
fs.oss.provider.endpoint = ECS_ROLE

3. 使用 Jindo Tensorflow§

以加载 jindo-tensorflow2.8 为例

3.1 通过 load_library 添加 collector§

import tensorflow as tf

tf.load_library("/path/to/jindosdk-x.x.x/lib/native/libjindo-tensorflow2.8.so")

3.2 通过 gfile 访问 oss-hdfs§

为避免与 tfio 中的 oss 前缀冲突,jindo-tensorflow 使用 joss 前缀。

# 目录操作
tf.io.gfile.mkdir("joss://<bucket>/test_mkdir")
content = tf.io.gfile.listdir("joss://<bucket>/test_mkdir")

# 读
gmnist = tf.io.gfile.GFile("joss://<bucket>/mnist.npz", "rb")
gmnist_file = gmnist.read()

# 写
fh = gfile.Open(f, mode="w")
content = "file content"
fh.write(content)
fh.close()

3.3 读取 TFRecordDataset§

tfRecordOssPath = "joss://<bucket>/test.tfrecord"
filenames = [tfRecordOssPath]
raw_dataset = tf.data.TFRecordDataset(filenames)

3.4 完整示例§

import tensorflow as tf
import numpy as np

tf.load_library("/path/to/jindosdk-x.x.x/lib/native/libjindo-tensorflow2.8.so")

gmnist = tf.io.gfile.GFile("joss://<bucket>/mnist.npz", 'rb')
print(gmnist.size())

with np.load(gmnist) as f:
    x_train, y_train = f['x_train'], f['y_train']
    x_test, y_test = f['x_test'], f['y_test']
    model = tf.keras.models.Sequential([
       tf.keras.layers.Flatten(input_shape=(28, 28)),
       tf.keras.layers.Dense(128, activation='relu'),
       tf.keras.layers.Dropout(0.2),
       tf.keras.layers.Dense(10, activation='softmax')
    ])
    model.compile(optimizer='adam',
                  loss='sparse_categorical_crossentropy',
                  metrics=['accuracy'])
    model.fit(x_train, y_train, epochs=5)