How to integrate with PyTorch DataLoaders
@jantonguirao がすでに取り組んでいます。
2024年10月29日 から。
評価
この issue はまだ評価されていません。
説明
Describe the question.
Hi,
I'm hoping to integrate nvImageCode with PyTorch DataLoaders (torch utils DataLoader, or FFCV DataLoader, or LitData DataLoader), but I'm struggling.
If I include the decoder as a transform to be used in my dataset.__getitem__ method, I get the dreaded cudaErrorInitializationError:
RuntimeError: Unhandled CUDA error: cudaErrorInitializationError initialization error
class CustomDataSet(StreamingDataset):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.decoder = nvimgcodec.Decoder() # cudaErrorInitializationError
def __getitem__(self, idx):
sample = super().__getitem__(idx)
sample['image'] = self.decoder(sample['image'])
return sample
I can have my dataset return the raw image bytes, and apply the decoder to the list of bytes which is fast, but then I have to loop over items to transform them into pytorch tensors which is slow because it operates over the entire batch sequentially (not in parallel workers). This single step is slow enough that it negates the advantage of using the nvimgcodec.Decoder().
class CustomDataSet(StreamingDataset):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
def __getitem__(self, idx):
sample = super().__getitem__(idx)
return sample
dataset = CustomDataSet(...)
dataloader = DataLoader(dataset, ...)
for batch in tqdm(dataloader):
imgs = decoder.decode(batch['image'])
imgs = [torch.tensor(img).moveaxis(-1,0) for img in imgs] # need to do this in the worker processes
I also tried to have my dataset return decode sources with ROIs, but this fails because DecodeSource is not pickleable.
class CustomDataset(StreamingDataset):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
def __getitem__(self, idx):
sample = super().__getitem__(idx) # <- Whatever you returned from the DatasetOptimizer prepare_item method.
roi = nvimgcodec.Region(0, 0, 224, 224) # replace with random crop later...
sample['image'] = nvimgcodec.DecodeSource(sample['image'], roi)
return sample
In any case, I've checked open bugs/issues, and the docs, and I can't find a good example of using nvimgcodec in the context of a dataloader with parallel workers. Any guidance or suggestions for how to handle this would be greatly appreciated.
Check for duplicates
- I have searched the open bugs/issues and have found no duplicates for this bug report
- 主要言語
- Jupyter Notebook
- スター
- 164
- フォーク
- 26
- 平均マージ
- 27分
- マージ済み PR(30日)
- 1
環境構築
- Dockerfile・Docker Compose ファイルなし
- プルリクエストのテンプレートなし
- コントリビューションガイドを読む
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
NVIDIA/nvImageCodec のほかの issue
-
難易度 2/5 1〜3時間 初心者へのやさしさ 79/100
NVIDIA/nvImageCodec#65 · コメント 1 件 ·
-
難易度 3/5 1〜2日 初心者へのやさしさ 72/100
NVIDIA/nvImageCodec#66 · コメント 1 件 ·
-
難易度 5/5 1週間以上 初心者へのやさしさ 38/100
NVIDIA/nvImageCodec#64 ·
-
nvjpeg2k error 3 (Bad jpeg) on valid JPEG 2000 aerial photos that OpenJPEG and ffmpeg decode identically対応中かも @mkepa-nv が 6 日前に担当しました。 オープンbug
NVIDIA/nvImageCodec#63 · コメント 2 件 · 担当者 1 名 ·
-
難易度 5/5 1週間以上 初心者へのやさしさ 8/100
NVIDIA/nvImageCodec#60 ·