讀寫(xiě)OSS數(shù)據(jù)
本文為您介紹如何使用OSS Python SDK及OSS Python API讀寫(xiě)OSS數(shù)據(jù)。
背景信息
對(duì)象存儲(chǔ)OSS(Object Storage Service)是阿里云提供的海量、安全、低成本及高可靠性的云存儲(chǔ)服務(wù)。DSW不僅預(yù)置NAS文件系統(tǒng),而且對(duì)接OSS存儲(chǔ)。
如果您需要頻繁訪問(wèn)和處理大規(guī)模數(shù)據(jù),推薦您在創(chuàng)建DSW實(shí)例時(shí)將OSS注冊(cè)為數(shù)據(jù)集,然后掛載該數(shù)據(jù)集;如果您只需要臨時(shí)訪問(wèn)OSS數(shù)據(jù),或者根據(jù)業(yè)務(wù)邏輯來(lái)決定是否訪問(wèn)OSS,可采用更靈活的方式,比如SDK和API方式。
OSS Python SDK
通常,您可以直接使用OSS的Python API讀寫(xiě)OSS中的數(shù)據(jù),詳情請(qǐng)參見(jiàn)OSS2 Package。
DSW已預(yù)裝OSS2 Python包,您可以參見(jiàn)如下方法讀寫(xiě)OSS數(shù)據(jù)。
鑒權(quán)及初始化。
import oss2 auth = oss2.Auth('<your_AccessKey_ID>', '<your_AccessKey_Secret>') bucket = oss2.Bucket(auth, 'http://oss-cn-beijing-internal.aliyuncs.com', '<your_bucket_name>')
需要根據(jù)實(shí)際需要修改以下參數(shù)。
參數(shù)
描述
<your_AccessKey_ID>
阿里云的AccessKey ID。
<your_AccessKey_Secret>
阿里云的AccessKey Secret。
http://oss-cn-beijing-internal.aliyuncs.com
OSS域名。需要根據(jù)實(shí)例的地域選擇對(duì)應(yīng)的OSS域名:
華北2(北京)后付費(fèi)實(shí)例:oss-cn-beijing.aliyuncs.com
華北2(北京)預(yù)付費(fèi)實(shí)例:oss-cn-beijing-internal.aliyuncs.com
華東2(上海)GPU P100實(shí)例或CPU實(shí)例:oss-cn-shanghai.aliyuncs.com
華東2(上海)GPU M40實(shí)例:oss-cn-shanghai-internal.aliyuncs.com
<your_bucket_name>
Bucket名稱(chēng),且開(kāi)頭不帶oss://。
讀寫(xiě)OSS數(shù)據(jù)。
#讀取一個(gè)完整文件。 result = bucket.get_object('<your_file_path/your_file>') print(result.read()) #按Range讀取數(shù)據(jù)。 result = bucket.get_object('<your_file_path/your_file>', byte_range=(0, 99)) #寫(xiě)數(shù)據(jù)至OSS。 bucket.put_object('<your_file_path/your_file>', '<your_object_content>') #對(duì)文件進(jìn)行Append。 result = bucket.append_object('<your_file_path/your_file>', 0, '<your_object_content>') result = bucket.append_object('<your_file_path/your_file>', result.next_position, '<your_object_content>')
其中
<your_file_path/your_file>
表示待讀寫(xiě)的文件路徑,<your_object_content>
表示待Append的內(nèi)容,需要根據(jù)實(shí)際情況修改。
OSS Python API
對(duì)于PyTorch用戶(hù),DSW提供OSS Python API,用于直接讀寫(xiě)OSS數(shù)據(jù)。
您可以在OSS存儲(chǔ)訓(xùn)練數(shù)據(jù)或模型:
加載訓(xùn)練數(shù)據(jù)
您可以將數(shù)據(jù)存放在一個(gè)OSS Bucket中,且將數(shù)據(jù)路徑和對(duì)應(yīng)的Label存儲(chǔ)在同一個(gè)OSS Bucket的索引文件中。通過(guò)自定義DataSet,在PyTorch中使用
DataLoader
API多進(jìn)程并行讀取數(shù)據(jù),示例如下。import io import oss2 import PIL import torch class OSSDataset(torch.utils.data.dataset.Dataset): def __init__(self, endpoint, bucket, auth, index_file): self._bucket = oss2.Bucket(auth, endpoint, bucket) self._indices = self._bucket.get_object(index_file).read().split(',') def __len__(self): return len(self._indices) def __getitem__(self, index): img_path, label = self._indices(index).strip().split(':') img_str = self._bucket.get_object(img_path) img_buf = io.BytesIO() img_buf.write(img_str.read()) img_buf.seek(0) img = Image.open(img_buf).convert('RGB') img_buf.close() return img, label dataset = OSSDataset(endpoint, bucket, auth, index_file) data_loader = torch.utils.data.DataLoader( dataset, batch_size=batch_size, num_workers=num_loaders, pin_memory=True)
其中
endpoint
為OSS域名,bucket
為Bucket名稱(chēng),auth
為鑒權(quán)對(duì)象,index_file
為索引文件的路徑,都需要根據(jù)實(shí)際情況修改。說(shuō)明示例中,索引文件格式為每條樣本使用英文逗號(hào)(,)分隔,樣本路徑與Label之間使用英文冒號(hào)(:)分隔。
Save或Load模型
您可以使用OSS2 Python API Save或Load PyTorch模型(關(guān)于PyTorch如何Save或Load模型,詳情請(qǐng)參見(jiàn)PyTorch),示例如下:
Save模型
from io import BytesIO import torch import oss2 # bucket_name bucket_name = "<your_bucket_name>" bucket = oss2.Bucket(auth, endpoint, bucket_name) buffer = BytesIO() torch.save(model.state_dict(), buffer) bucket.put_object("<your_model_path>", buffer.getvalue())
其中
endpoint
為OSS域名,<your_bucket_name>
為OSS Bucket名稱(chēng),且開(kāi)頭不帶oss://,auth
為鑒權(quán)對(duì)象,<your_model_path>
為模型路徑,都需要根據(jù)實(shí)際情況修改。Load模型
from io import BytesIO import torch import oss2 bucket_name = "<your_bucket_name>" bucket = oss2.Bucket(auth, endpoint, bucket_name) buffer = BytesIO(bucket.get_object("<your_model_path>").read()) model.load_state_dict(torch.load(buffer))
其中
endpoint
為OSS域名,<your_bucket_name>
為OSS Bucket名稱(chēng),且開(kāi)頭不帶oss://,auth
為鑒權(quán)對(duì)象,<your_model_path>
為模型路徑,都需要根據(jù)實(shí)際情況修改。