You need to enable JavaScript to run this app.
文档中心
对象存储

对象存储

复制全文
下载 pdf
TOS PyTorch Connector
最佳实践
复制全文
下载 pdf
最佳实践
本文介绍 TOS PyTorch Connector 的标准编程模版、性能优化建议、配置日志。​
标准编程模板​
TosMapDataset、TosIterableDataset、TosCheckpoint 都实现了 __enter__ 和 __exit__ 函数,因此推荐使用上下文管理模式编程,并统一处理 TosException。​
​
from tostorchconnector import TosMapDataset, TosIterableDataset, TosCheckpoint, CredentialProvider, TosException​
​
#数据集路径​
dataset_uri = 'tos://bucket/prefix'​
checkpoint_uri = 'tos://bucket/key'​
region = 'cn-beijing'​
#火山 TOS Endpoint​
endpoint = 'http://tos-cn-beijing.ivolces.com'​
ak = '<your-access-key>'​
sk = '<your-secret-key>'​
​
#使用 TosMapDataset​
try:​
with TosMapDataset.from_prefix(dataset_uri,​
region=region, endpoint=endpoint,​
cred=CredentialProvider(​
ak=ak,​
sk=sk)) as dataset:​
for item in dataset:​
print(item.key)​
except TosException as ex:​
print(str(ex))​
​
#使用 TosIterableDataset​
try:​
with TosIterableDataset.from_prefix(dataset_uri,​
region=region, endpoint=endpoint,​
cred=CredentialProvider(​
ak=ak,​
sk=sk)) as dataset:​
for item in dataset:​
print(item.key)​
except TosException as ex:​
print(str(ex))​
​
#使用 TosCheckpoint​
try:​
with TosCheckpoint(region, endpoint, cred=CredentialProvider(ak, sk)) as checkpoint:​
#使用 TosObjectWriter​
with checkpoint.writer(checkpoint_uri) as writer:​
writer.write(b'hello')​
writer.write(b'world')​
​
#使用 TosObjectReader​
with checkpoint.reader(checkpoint_uri) as reader:​
data = reader.read()​
assert data == b'helloworld'​
except TosException as ex:​
print(str(ex))​
​
性能优化​
  1. 大对象读写场景:可通过配置更高的并发数来提升性能。​
  1. PyTorch 数据集加载场景:可通过配置预加载读取并发数来提升性能。​
  1. 单对象反复读取场景:可通过选择带缓存 Reader 来提升性能。​
说明​
  • ReaderType.SEQUENTIAL:带缓存的 Reader,会在内存缓存全部数据,适用于单对象反复读取场景。​
  • ReaderType.RANGED:带缓存的 Reader 但仅会在内存缓存一定大小的数据,适用于单对象小块数据反复读取,又希望控制内存缓存大小的场景。​
  • ReaderType.DIRECT:不带缓存的 Reader,适用于一次性读取的场景。​
​
​
from tostorchconnector import CredentialProvider, TosClientConfig, ReaderType, TosIterableDataset, TosCheckpoint​
​
region = 'cn-beijing'​
# 火山 TOS Endpoint​
endpoint = 'http://tos-cn-beijing.ivolces.com'​
ak = '<your-access-key>'​
sk = '<your-secret-key>'​
​
#1. 大对象读写场景​
shared_prefetch_tasks = 200​
shared_upload_part_tasks = 200​
with TosCheckpoint(region, endpoint, cred=CredentialProvider(ak, sk), ​
client_conf=TosClientConfig(shared_prefetch_tasks=shared_prefetch_tasks,​
shared_upload_part_tasks=shared_upload_part_tasks)) as checkpoint:​
pass ​
​
#2. PyTorch 数据集加载场景​
dataset_uri = 'tos://bucket/prefix'​
prefetch_concurrency = 256​
with TosIterableDataset.from_prefix(dataset_uri, region=region, endpoint=endpoint, cred=CredentialProvider(ak=ak, sk=sk), prefetch_concurrency=prefetch_concurrency) as dataset:​
pass​
​
#3. 单对象反复读取场景​
checkpoint_uri = 'tos://bucket/key'​
with TosCheckpoint(region, endpoint, cred=CredentialProvider(ak, sk)) as checkpoint:​
with checkpoint.reader(checkpoint_uri, reader_type=ReaderType.SEQUENTIAL) as reader:​
pass​
​
with TosIterableDataset.from_prefix(dataset_uri, region=region, endpoint=endpoint, cred=CredentialProvider(ak=ak, sk=sk), reader_type=ReaderType.SEQUENTIAL) as dataset:​
pass​
​
配置日志​
TOS PyTorch Connector 提供了按天级别滚动的日志能力,可通过 tostorchconnector.init_log 开启日志,如下所示。​
​
from tostorchconnector import init_log​
#日志级别​
level = 'info'​
#日志目录​
directory = 'logs' ​
#日志文件名前缀​
file_name_prefix = 'connector'​
init_log(level, directory, file_name_prefix)​
​
由于日志初始化需要在每个进程启动时完成各自的初始化,在多进程数据集加载场景需要使用 worker_init_fn 函数完成各进程的日志初始化配置,如下所示:​
​
from tostorchconnector import TosMapDataset, CredentialProvider, init_log​
​
region = 'cn-beijing'​
#火山 TOS Endpoint​
endpoint = 'http://tos-cn-beijing.ivolces.com'​
ak = '<your-access-key>'​
sk = '<your-secret-key>'​
dataset_uri = 'tos://bucket/prefix'​
​
def transform(item):​
data = item.read()​
return item.key, item.size​
​
def worker_init_fn(x):​
init_log('info', 'logs', 'connector.log')​
​
with TosMapDataset.from_prefix(dataset_uri, region=region, endpoint=endpoint,​
cred=CredentialProvider(ak, sk),​
transform=transform) as dataset:​
train_loader = DataLoader(dataset=dataset, batch_size=256, num_workers=32,​
shuffle=True, worker_init_fn=worker_init_fn)​
for data in train_loader:​
print(data)​
​
​
最近更新时间:2026.02.02 14:44:15
这个页面对您有帮助吗?
有用
有用
无用
无用