From 5d9816244109077ae575f9d980b85f3f5cac676b Mon Sep 17 00:00:00 2001 From: Alena Davis Date: Tue, 25 Jul 2023 13:40:29 -0400 Subject: [PATCH 1/8] Create 2023-07-25 datapipes blog post --- ...-25-announcing-cpp-based-s3-io-0-datapipes | 138 ++++++++++++++++++ 1 file changed, 138 insertions(+) create mode 100644 _posts/2023-07-25-announcing-cpp-based-s3-io-0-datapipes diff --git a/_posts/2023-07-25-announcing-cpp-based-s3-io-0-datapipes b/_posts/2023-07-25-announcing-cpp-based-s3-io-0-datapipes new file mode 100644 index 000000000000..c488b7b2de38 --- /dev/null +++ b/_posts/2023-07-25-announcing-cpp-based-s3-io-0-datapipes @@ -0,0 +1,138 @@ +--- +layout: blog_detail +title: "Announcing CPP-based S3 IO DataPipes" +author: John He, Khaled ElGalaind Roshani Nagmote, Daiming Yang +--- + +Training large deep learning models requires large datasets. [Amazon Simple Storage Service](https://aws.amazon.com/s3/) (Amazon S3) is a scalable cloud object store service used for storing large training datasets. Machine learning (ML) practitioners need an efficient data pipe that can download data from Amazon S3, transform the data, and feed the data to GPUs for training models with high throughput and low latency. + +In this post, we introduce the new S3 IO DataPipes for PyTorch, [S3FileLister](hhttps://github.com/pytorch/data/blob/main/torchdata/datapipes/iter/load/s3io.py#L19) and [S3FileLoader](https://github.com/pytorch/data/blob/main/torchdata/datapipes/iter/load/s3io.py#L106). For memory efficiency and fast runs, the new DataPipes use the C++ extension to access Amazon S3. Benchmarking shows that S3FileLoader is 59.8% faster than [FSSpecFileOpener](https://github.com/pytorch/data/blob/main/torchdata/datapipes/iter/load/fsspec.py#L125) for downloading a natural language processing (NLP) dataset from Amazon S3. You can build [IterDataPipe](https://pytorch.org/data/beta/torchdata.datapipes.iter.html) training pipelines with the new DataPipes. We also demonstrate that the new DataPipe can reduce overall Bert and ResNet50 training time by 7%. The new DataPipes have been upstreamed to the open-source [TorchData 0.4.0](https://github.com/pytorch/data/releases/tag/v0.4.0) with [PyTorch 1.12.0](https://github.com/pytorch/pytorch/releases/tag/v1.12.0). + + +## Overview + +Amazon S3 is a scalable cloud storage service with no limit on data volume. Loading data from Amazon S3 and feeding the data to high-performance GPUs such as NVIDIA A100 can be challenging. It requires an efficient data pipeline that can meet the data processing speed of GPUs. To help with this, we released a new high performance tool for PyTorch: S3 IO DataPipes. DataPipes are subclassed from **torchdata.datapipes.iter.IterDataPipe**, so they can interact with the **IterableDataPipe** interface. Developers can quickly build their DataPipe DAGs to access, transform, and manipulate data with shuffle, sharding, and batch features. + +The new DataPipes are designed to be file format agnostic and Amazon S3 data is downloaded as binary large objects (BLOBs). It can be used as a composable building block to assemble a DataPipe graph that can load tabular, NLP, and computer vision (CV) data into your training pipelines. + +Under the hood, the new S3 IO DataPipes employ a C++ S3 handler with the AWS C++ SDK. In general, a C++ implementation is more memory efficient and has better CPU core usage (no Global Interpreter Lock) in threading compared to Python. The new C++ S3 IO DataPipes are recommended for high throughput, low latency data loading in training large deep learning models. + +The new S3 IO DataPipes provide two first-class citizen APIs: +* **S3FileLister** – Iterable that lists S3 file URLs within the given S3 prefixes. The functional name for this API is **list_files_by_s3**. +* **S3FileLoader** – Iterable that loads S3 files from the given S3 prefixes. The functional name for this API is **load_files_by_s3**. + + +## Usage + +In this section, we provide instructions for using the new S3 IO DataPipes. We also provide a code snippet for **load_files_by_s3()**. + +### Build from source +The new S3 IO DataPipes use the C++ extension. It is built into the **torchdata** package by default. However, if the new DataPipes are not available within the environment, for example Windows on Conda, you need to build from the source. For more information, refer to [Iterable Datapipes](https://github.com/pytorch/data/tree/main/torchdata/datapipes/iter/load#s3-io-datapipe-documentation). + +### Configuration +Amazon S3 supports global buckets. However, a bucket is created within a Region. You can pass a Region to the DataPipes by using **__init__()**. Alternatively, you can either **export AWS_REGION=us-west-2** into your shell or set an environment variable with **os.environ['AWS_REGION'] = 'us-east-1'** in your code. + +To read objects in a bucket that aren’t publicly accessible, you must provide AWS credentials through one of the following methods: + +* [Install and configure](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html) the [AWS Command Line Interface](aws.amazon.com/cli) (AWS CLI) with **AWS configure** +* Set credentials in the AWS credentials profile file on the local system, located at **~/.aws/credentials** on Linux, macOS, or Unix +* Set the **AWS_ACCESS_KEY_ID** and **AWS_SECRET_ACCESS_KEY** environment variables +* If you’re using this library on an [Amazon Elastic Compute Cloud](aws.amazon.com/ec2) (Amazon EC2) instance, specify an [AWS Identity and Access Management](aws.amazon.com/iam) (IAM) role and then give the EC2 instance access to that role + + +### Example code +The following code snippet provides a typical usage of **load_files_by_s3()**: + + +``` +from torch.utils.data import DataLoader
 +from torchdata.datapipes.iter import IterableWrapper

 + +s3_shard_urls = IterableWrapper(["s3://bucket/prefix/",])
 +s3_shards = s3_shard_urls.load_files_by_s3()
 +# text data
 +training_data = s3_shards.readlines(return_path=False)
 +data_loader = DataLoader( + training_data, + batch_size=batch_size, + num_workers=num_workers,
 +)
# training loop
 +for epoch in range(epochs):
 + # training step
 + for bach_data in data_loader:
 + # forward pass, backward pass, model update 
 +``` + + +## Benchmark + +In this section, we demonstrate how the new DataPipe can reduce overall Bert and ResNet50 training time. + +### Isolated DataLoader performance evaluation against FSSpec + +**FSSpecFileOpener** is another PyTorch S3 DataPipe. It uses **botocore** and **aiohttp/asyncio** to access S3 data. The following is the performance test setup and result (quoted from [Performance Comparison between native AWSSDK and FSSpec (boto3) based DataPipes](https://github.com/pytorch/data/issues/500)). + +The S3 data in the test is a sharded text dataset. Each shard has about 100,000 lines and each line is around 1.6 KB, making each shard about 156 MB. The measurements in this benchmark are averaged over 1,000 batches. No shuffling, sampling, or transforms were performed. + +The following chart reports the throughput comparison for various batch sizes for **num_workers=0**, the data loader runs in the main process. **S3FileLoader** has higher queries per second (QPS). It is 90% higher than **fsspec** at batch size 512. + + +(/assets/images/2023-7-25-announcing-ccp-based-s3-io-datapipes-1.png){:style="max-width:620px; width:100%; display: block; margin-left: auto; margin-right: auto"} + +The following chart reports the results for **num_workers=4**, the data loaders runs in the main process. **S3FileLoader** is 59.8% higher than **fsspec** at batch size 512. + + +(/assets/images/2023-7-25-announcing-ccp-based-s3-io-datapipes-5.png){:style="max-width:620px; width:100%; display: block; margin-left: auto; margin-right: auto"} + +### Training ResNet50 Model against Boto3 +For the following chart, we trained a ResNet50 model on a cluster of 4 p3.16xlarge instances with a total 32 GPUs. The training dataset is ImageNet with 1.2 million images organized into 1,000-image shards. The training batch size is 64. The training time is measured in seconds. For eight epochs, **S3FileLoader** is 7.5% faster than Boto3. + + +(/assets/images/2023-7-25-announcing-ccp-based-s3-io-datapipes-2.png){:style="max-width:620px; width:100%; display: block; margin-left: auto; margin-right: auto"} + +### Training a Bert model against Boto3 +For the following cart, we trained a Bert model on a cluster of 4 p3.16xlarge instances with a total 32 GPUs. The training corpus has 1474 files. Each file has around 150,000 samples. To run a shorter epoch, we use 0.05% (approximately 75 samples) per file. The batch size is 2,048. The training time is measured in seconds. For one epoch, **S3FileLoader** is 7% faster than Boto3. + + +(/assets/images/2023-7-25-announcing-ccp-based-s3-io-datapipes-3.png){:style="max-width:620px; width:100%; display: block; margin-left: auto; margin-right: auto"} + +### Comparison against the original PyTorch S3 plugin +The new PyTorch S3 DataPipes perform substantially better than the original [PyTorch S3 plugin](https://github.com/aws/amazon-s3-plugin-for-pytorch). We have tuned the internal buffer size for **S3FileLoader**. The loading time is measured in seconds. + +For the 10 sharded charades files (approximately 1.5 GiB each), **S3FileLoader** was 3.5 times faster in our experiments. + +### Best practices +Training large deep learning models may require a massive compute cluster with tens or even hundreds of nodes. Each node in the cluster may generate a large number of data loading requests that hit a specific S3 shard. To avoid throttle, we recommend sharding training data across S3 buckets and S3 folders. + + +(/assets/images/2023-7-25-announcing-ccp-based-s3-io-datapipes-4.png){:style="max-width:620px; width:100%; display: block; margin-left: auto; margin-right: auto"} + +To achieve good performance, it helps to have file sizes that are big enough to parallelize across a given file, but not so big that we hit the limits of throughput on that object on Amazon S3 depending on the training job. The optimal size can be between 50–200 MB. + + +## Conclusion and next steps + +In this post, we introduced you to the new PyTorch IO DataPipes. The new DataPipes use **aws-sdk-cpp** and show better performance against Boto3-based data loaders. + +For next steps, we plan to improve on usability, performance, and functionality by focusing on the following features: + +* **S3 authorization with IAM roles** – Currently, the S3 DataPipes support explicit access credentials, instance profiles, and S3 bucket policies. However, there are use cases where IAM roles are preferred. +* **Double buffering** – We plan to offer double buffering to support multi-worker downloading. +* **Local caching** – We plan on making model training able to traverse the training dataset for multiple passes. Local caching after the first epoch can cut out time of flight delays from Amazon S3, which can substantially accelerate data retrieval time for subsequent epochs. +* **Customizable configuration** – We plan to expose more parameters such as internal buffer size, multi-part chunk size, and executor count and allow users to further tune data loading efficiency. +* **Amazon S3 upload** – We plan to expand the S3 DataPipes to support upload for checkpointing. +* **Merge with fsspec** – **fsspec** is used in other systems such as **torch.save()**. We can integrate the new S3 DataPipes with **fsspec** so they can have more use cases. + + + + +### Acknowledgement + +We would like to thank Vijay Rajakumar and Kiuk Chung from Amazon for providing their guidance for S3 Common RunTime and PyTorch DataLoader. We also want to thank Erjia Guan, Kevin Tse, Vitaly Fedyunin , Mark Saroufim, Hamid Shojanazeri, Matthias Reso, and Geeta Chauhan from Meta AI/ML, and Joe Evans from AWS for reviewing the blog and the GitHub PRs. + + + +### References + +* [Announcing the Amazon S3 plugin for PyTorch](https://aws.amazon.com/blogs/machine-learning/announcing-the-amazon-s3-plugin-for-pytorch/) +* [Performance Comparison between native AWSSDK and FSSpec (boto3) based DataPipes](https://github.com/pytorch/data/issues/500) From f83e6c09faad135fe55a49f878c3bfc5c64aac3e Mon Sep 17 00:00:00 2001 From: Alena Davis Date: Tue, 25 Jul 2023 13:44:25 -0400 Subject: [PATCH 2/8] Add files via upload --- ...5-announcing-ccp-based-s3-io-datapipes-1.png | Bin 0 -> 50800 bytes ...5-announcing-ccp-based-s3-io-datapipes-2.png | Bin 0 -> 26425 bytes ...5-announcing-ccp-based-s3-io-datapipes-3.png | Bin 0 -> 32988 bytes ...5-announcing-ccp-based-s3-io-datapipes-4.png | Bin 0 -> 33722 bytes ...5-announcing-ccp-based-s3-io-datapipes-5.png | Bin 0 -> 49513 bytes 5 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 assets/images/2023-7-25-announcing-ccp-based-s3-io-datapipes-1.png create mode 100644 assets/images/2023-7-25-announcing-ccp-based-s3-io-datapipes-2.png create mode 100644 assets/images/2023-7-25-announcing-ccp-based-s3-io-datapipes-3.png create mode 100644 assets/images/2023-7-25-announcing-ccp-based-s3-io-datapipes-4.png create mode 100644 assets/images/2023-7-25-announcing-ccp-based-s3-io-datapipes-5.png diff --git a/assets/images/2023-7-25-announcing-ccp-based-s3-io-datapipes-1.png b/assets/images/2023-7-25-announcing-ccp-based-s3-io-datapipes-1.png new file mode 100644 index 0000000000000000000000000000000000000000..e76cd2486ed358aa3a0ca9197c05610fbdbd8640 GIT binary patch literal 50800 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

q0KCYPPKi_Rki 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 literal 0 HcmV?d00001 diff --git a/assets/images/2023-7-25-announcing-ccp-based-s3-io-datapipes-2.png b/assets/images/2023-7-25-announcing-ccp-based-s3-io-datapipes-2.png new file mode 100644 index 0000000000000000000000000000000000000000..62e864d70d52624b4e414a2dd38de5f791bf3277 GIT binary patch literal 26425 zcmd?RXH-<%)-76qVjvh$L`jO6ksKu%5JZxSiWmqIBuJJV4WLL8P)Pzt5CaHE&LSX^ zL_l(~fKqZUpa{1w&v)OC`|G{i?)!1uw@*85w++;)wdR~-jNbd`WBH%aRAE`aV?BvP zVo^P%bdE%#_aTw!?yY6SPZBu zA}!!YK7U9gM`03a(11ib5=kO$vwfC(Rt~>lysoCAL|P&K_q-r696woSdrH@VL}K4V z{GU$s9RE0exaO9s#>q95HCxyY^0B^QNhFbssj5oH&bzdYEZwj@?|f%$rKs-j>x+j} z9^E^7d*_{R2A_f)ij7i6Qk!|&#mK6%>FMcLvMjQ!n>^=IKIUp!H+c{J`q=g{FWo^t zZX(b*wp6;uhoxN7Ak6BGZ%$CJg7Of5R8t6(}*m zq3V0bB$ydU4dR>dPw3EnvNVU^ZL)M%caV#m^_8c-ob;WFCzX_x`r0Vc!Bpp>?vOf4 zX?H_|QD9);)e%QF;!}rqW(=gfefyxgT7A)9>5i?mx|7pvlb#}R$tdGYD~2CUO}-|& zq`6Kn?-ytOSfs>1z&}^%DvdYK<-U(!XVmWZ?<*EWy#nw1Ej`39UvFQ1l(@9`E7E>G zKE5#1EhOSkeg@J%$8S$XpCxUyV%MAe?tW=jKf|k&l&U^^t_oT9BaEWD=Nb0%O>z%Nvu0XpaSZOg-kwS2 z;b8Hy_Q`%$r^&y$%f4?=n3zP%+yQ*I$NfFws=p`ZPOd377WF4fM<%H9g&G(e z_oZ0|3smLy)kRd^XqQaA6sW}ag1j?aS)U#@3jiLu46LwVC#Rx`0*oxZVe^SbDmnATj!Ln9+2tL`4N&go}oKYaPtFY3f;t0G#wyWo-F z((!TO+eeFKHIoegxZUJ&tO`4EpLL>EcI=F0ernQ&cQ=HFtCb)=`Xpeb7~pSBNzhl^JkQQC6Ot ztPgwh?7vVVRh1w@G)P zXkPqyxr|y!El?{g&O2srVBk}<*e@h5F8;~1X2)nYIrxx$*VVv@k~-l)k=xt`wziL) zyFDZ1-Dhpvt+MPYxSg*~*g6~->h9{QeR}xHCxL+c{QLm7cv|fG`=!RFrav1Szs`=d zM~U62UCofpDHjtHGv7JprQ+@`>s8eK{=zePcgfIGeGlV8M%}V2M!$vb=900$S6HZ^ z8GGcUrY7s2J$o8|{Sq}QXYN^G_D(u-v)^XNSjB&3Yfv16xQ9kIB-^c%ENZ zY*J0C*y(QMP|0c#y;tw}5GwOaapevdy z6WT8*$TO8QdW2Wr?Q!?wfK>N>lGCkQKU!K&UA)LXHBd7p7;J5&=k2ZNJy*)h!NDPI zna5qROG+xjd$GcMn*O;V$E{np#uumRh{b$a|29j#!tU*d4}G-m6$P~jL3xVTElWAv zx3tUn&XXrkR>#S67Ik}{6twj-+!#=1W^J8-<8kK>{jcO}?v?TVg@q|8A)R^74L^S# z*VE(4>U3(qz~VzHC@2{2E{exaTUc5a_^kTT*;$im)ox~GwFkG-Zk;zGyNT3!w7{xe z@`$W#&fkQXx5>$cZ>b4g=R0jnS#Gwb`7*3wwVmu!6%vjOFyufO70&%;YHM##N=_bd z@22sPbai#_9e;7?@@{!APN&h1%J(US-$Qq+d=g-aucI_Q*U{0L`f*}Is>{UnMX!~u z8{TxUZg&6i#3q8?AX-#|tt#!4RSZ_0UEosj7hk4Sfq?LRTJ}A~bUSwJ`19w_P7dZY zi>7xXV_H^zv2Ph`9Fqqc{q<~g*%QovQ)x1`J)|pH*8PRF(b6$$h;E#DG(s=MU)nKh z^yHUoiT(<8OAcdQ1#;95hw~RNiaHFaFM1U@_c}H=3o}0q2+;j(7OFGVD=38MI-s54 zQWc>5Dt}?{{mriYsNvz8SXwnJtHa#f+#Yki_qnjq+w@#+r=^J=JalNEoM4iKaGm0c z975&slP71-oDm*K*UmCpEL80rZ8UO7rk>>6^i=TLL&WI(WdADq+agt`u31~u7!Qhe zDmvKPU&^r9IzK=E;cAY3wE}lh5QP>+yI~Q&pmZ)oXVCs!ME#E+#k?zXDuaWAbCp_N zzkNAMh4=5@Z!k01#HHX7$!U{6@nI<+)Y-O z8@zpFzq?Z7e*4#q=0+?=H=>5~%u(ds_Uf<^3`>H8de%@5K~7`GEqm(4h76 zTS5=5r5!9;JL^>Y85O7$h4_%8JC7DJ$hFx#oypdZRFV(YpoyTgOo=xl0PSi{_s$iwRP1+zo zz0tYLbstIw|K@eyzki==_FmFKK$@AE8MJ*ir{o*Vdnlk($%*qFT2Mo#5Mfx-}f)O-X%jGm38*47>l2vTpmcbT^rIx4KYxB458m9^ z)MUuP*woZyY+^EDvodS*Ou;icIa%u@=wWC3I4M+ zb6#&pyS4R)y!`T3I;gJ;yPl};t!P|KC=_&T9bL$4f6SVZU~j$N=eO$NY}2|p4OP{3 zs6@{b6Yux-8h+{hM7>;6MD^lXzu``6V%dxX@J!A%EI0Q^f@bWXgxFYXIlZKR;_Fm!m3YtD?V+dcb#z=EsE#_Ze+v=8T?^O@!*)r8Ce|lReJ_&krqa^V z;f|c}*;%Lc>(^h(w%yf`sI}&KdU`mq3xNnl<;_-pLfdNr0 z9dU2JG-?s0f5ygc0OmY?{MhAKS!W?0276M9b=l6r@f;`|z)TnbK*)pf?lGGpNlD3{ z&CQf1e$6fPoI7^pJEmL30FL~?F+t*Rbad>aP{`7(ot>Rr(zZTE6~UWADk`h1U%z|z z5Nn1Ts_?LBYinyM@>WEWc$1bE#x3h)+xKk~65*wEQx+nMyb@^(3$|SMk&HAogPUzy zg_+kgF|G4GzD+`2)1s)Yyj*#9tXoS%%RZ{99O8o@#Vz=<2%fo-)2HwQ;gPs!abnR8dKsv~ADT)1Fl zZNV>pfb>0*No~;EUx~g!95=0}9oH^3TC_Y=)RJnnX7}#h#ecZpc8?_{CkH3Sxjmem zw6|&1_n25MR4~06%U0aHy8q$ULvyWlUIVLlQIoSWGuex}>xNQ_Y70GS(g*}BGUb}L z50-D@rrn29|1V<<;!tYsbkVy zJYwrbG6u{RDQ%e=qEUU*e;a_;u~7RD9GJ*#qD+N`ho8XHv}f5+aFV}XPZiM!O~wgZ zo~uv{JH>x$Z}{h|Ecc;{h@Zg-y3$nTOhysz`~JMuPqj+d+FTydPSrI1{P`t*W$}iepI?5=qh@_? zZXfK#>C>n8A3XS*xHVu;x#c-BFo|LGUa*=ESF(b;y7U%kwARn&Y&UA3O(?(cnr*!y zxA5mxWC8)#P9sm&n{A1&s{k}~`R%{&QohSXPE>@xSJc3O>F%CEL`jtu?z(^KcYEQTDqk39gWwv{n69GLjdjh8q zA#%&vxuL1)Bp&6SL@ZK5h{D1HV%>-Gy_VcWMMb}T|NeVyd35YsRh1ESv@?IU&GMPF z-5oRW!A=hoQ`2)-u2c~x1sHw6QwN00_3xXAx9{KY-m*RwFgiCc?|`77X?fswHpZhB zc7W)6IhgGi=j@!ux@u6&3fd-+V8q15l`dS^x_b5MF896b#YX3;-w&mHa-A~0o*GGQ zGZ6lU5OSTY+=pT_efemnO?U0W%n*@Nke_g`n*z!}SI+GJii|#2AL7-w`asrLA2z%K zfA)7|gj;*}rSs>%)<|_%gGPXi1nXonv$7KOVWRa$e0_WSkY^TR75hX^N{pNQQe?=1 z!Zbb*W8=06Ls+KF}gE8sWtcN z%^nk32=LrPffo;?ca#g{v`I(b1P8RQug`X>MoRna*<(o5M6Ia^<~BAq9x_Y&Ee{MWsqrJoOxg@s;aD99%=gI=+0uRtj=--u-VO_2{EEm_nG2Hg7LjN<0M)pW%J3)c~4e$Z5hod_;KF`i>;anH3zE^c`IMcF_feTUB|8u4B)@+C+y~&7ASMcn<0nvr%0T?f#r03VIt!UYSKB4K>Y#u?-_tAB z6Us@FpusrLKnf~2Xe2ECz{jjEz9@A99uT2S)Jm^~1H@u2FU||-rrmq??3oB9)xAFU zh~q)2E|=XZ!CbxLy`|VgVdv4S$6ss&2gH9E=(0o10EuS{QZ6tlHq*~W<(&G$B=jge zoIJCsBg=;OXs%Vur`w1iZ9To(?@ta@ z*48EN+(Lr2CX6zn<}~z~#>m5L3b2vK%{hyaagr`SV;_ zTH3d|x~r#z7Dsck9tRsMBqvQy(Ngv z10YXL?=Ik38VDfp?FK?Y%6m#mkCY`4u)OTmJX zQsi_jlZ|n1`|0Z(jEF<>pZZtC<7_>2k-%(}cyCQ3quoQzDK`cilK^$D>$3BDPH&QR z8h)Oi|18F)Fbc<9Gfu7&)Y^y1IsVa5JP5SIiEb?HAC$~YE0jzbk2zuBgb#WJ(fCAb z-lxpZpFe>I+S}W^Aff4|USC~eu(4D)QpAX{Xk}@Pi1wPA8UiNb`7d9&QdwEqJ5j-# z`1$je3cKu?UswJP4NZOF6;5z{{rdI2ruRAy3)AL>i<4@AjU@=#+RM%yhra>S)Fofb z18D7oPBKfs?kJ8>O8(?}+Uy7!Y4`Edr;~qPg-mw2kJ*j)9Gje)ave-c%=h`rxR!d{ z4aqCcbzr*=!CyB&YXm{x-Z@%jD=Iu z7TEaU!GkWtsTKLhc9J8wLn@H3`*@dodEdT$J0ATF6mIL*ttij|i;Es9vzgi1k;GxE zt<}_wR~Ye4bYS^m7jsxmO^vvhONAaXy|$5HnO@YqZaV;Rg_XrA5r^v76x8yY@knDt zFiUe0`Nn&N>P^8xzuB4lBszKr*1a{)SqKP~Km>9VU)j1u5O(KK^x--GCtR%hQR-2CFLU=H|#D^QFAY zM{nHNhtOXHh%x>9^9^ytQuOPXgz}4fdUhT@d|2-=pxhdBkR%)v-~x&s@0qH!Z?&~V z#<`B~A`U}-zTEXx4ya!wJ*%`l%}V32%uGoVFyVJl&{cu6TT#Dv?%r)w?Sxea3KP)? zudS_JXZgLOEtfcYK+?o|D=RB!(?;`j(~Q>%Up_QH_&()lXQzgvqlDsorBoA4)3%IDX z1HHp#G>6iXX~lUZ^QK{C*dFlRA8l>lahy4}Z#S%omXMq83kPchHQ1;5Y`iw2QQ;?~ zeJBi5Ek+?Cj)UjNXw%5Qv5{A0$Qk}QhHpq>WGOfr|+TYR9 zxKA_3eunsw);%?`8*UNl@}yqt@?P;&pbd)wx#;FO9adbZ57~d{5Q8$)bLH>#5d%_=4m{w@Bn=e<9?0;gAbQd@BIFK z-ObHyt}k5cpZYkyE^s!+^5#wc&{M+D!BD|Yibeqqtg1@8gbf982937w`xYu9!RxQ| z`@`)`qeln@3)mcW#P!dM``Jsg?NPGMf(hotrp0+LyQchb7OGBK3ay=y`{l13t!cdY zt)TI2-KZog)p&UP;@3QmYzF3c@80EKKBL1I`aCz6IEpsoRb>#_J6tKT9nctY56FPW zaf~4Tbg`7?(2vZG(77Om>gKzoN`>VmB=`*uTHpX*yLRo;(~|=1L{0&61^&!8f(lrm z@Q|n+xXzc$hSafOa-fXhsLa5x+PL>Cmj+3`D!iVL%L2B!Ggw(zSmd8gbnbNACe>kk z*Lf<*W7GMoSF0gC1I_b=oYw>4z_;p5xV|AghMmP=%kJp^xn7c6t zBd`lUkQNBQm^=>f^H;A*-$pYjXoO32yVk4>~ zZj`Iy1<)3DEZvT*?6pGcPKRa#cv*>@dq6-y?tP}YNBCbPnz|L5_ew~CJ2lOnYHeEk z>~F!ZtsxbE2M6huX$ASq3qyJ<2c@3pYJ`pM+`?fs2{6JoJ9f9;b|yW3Y4`(cJMLO; zs#=VYMP`PY(~T>`L~0IDqOX^D23;u?4s9H3%ZHbe#if-Oe^Kqi)`}Z9U&ePYQ_B$QmC^~Fy<=-yO&Uzo3 zdBU4Fgrfe*xN`HCUSVXCB^njD`@n$%GL|xw^^(@Sr>Gp+Q(|#r(%C~{5fM^*-vXY6 zg@=~{i2*cKj8WZhi^|Hz7zm$|k6;2}lEb=+gg0r#w(_bZ~HT;b%^U*HaT$ zimJtmqVv)=!K>evmuRhNCQOKxUT_f;Fbo{;ps4bSPFAXPj;B$@2GZ?%+Yu_QBCtbC zUMDXv4>}j0m{>Rvo6UF#Z2>w05>QL}jSXlkd?ina?0zvdHC0e}dmEbq!jn_Vx^Jdg zzd~4^`rT%dhkxcXxNFv8DzF z#qHG5F+hO)vklfC4Zs#r_4IVNg;dBm3^3!Ufntme6m!4+EzJrQ@?NQ-o4b2~Q3u!* z%R#K(cCksX#hgF08r8^(oBc`p-EVX6Hg~9$yrb)&SYLj$|}L)$Z?f?(Qc<&Vm3lP^ScQXvPG2ww>*`0G737+cqOz z_MDuY4)nCJJ89+(dkOFiyhw;!Qr#Y62)pTDCW|L4g_)t>zfDP@1PB%O6i~aSl%E85 zGg51_GBTRppH#iJuPQB{sZl9j>a33{%lagAX>$6XUU31fmBw>}i*SmE9f_@ULCsd; zg9;M&SS9#PFsu4fmU;B_^z=9u)BsL~Q3LWPewv&&x>-n(2*DZfkDo801>cRATFMiy*EL0>*cclA-aa&|vR z4o?p05Risw;O98(gG>o5;c{0R6ar-#0q#~6Y3ApiMc+lE0$Y($%m?(7NrEY5uQ*RPAYxw-jXM-lBMCC8w~DNA#iLcrK|!J%K$@XfFN zx$#j4Gqhr4E#?8Rk+YE6TzYP=$qz6T8Y|yqa+}yi7hBLIGr$bq(V4H8x&o z|Mx={g~;vh83&;)|L=Xl&%AUg+ohZ4yuH~*PkMSdcoGw`0jM~*xe&xle@c7h?<@A z%5BY>H3juwla@4P(KEBOoEorDj|~@`nbQlz7od*@K~_CRvWB*t(_I1~h>-MZv|W=& znUk)uGM7Gw#Lej{SE$@*wL>%Zbq@3zfDM*fsOwNI(8eB_sbls%-nG^{%U^2CdRK|j zOsj^D4s`)`@Tg|@TgKMb$y84(d@p0vYt{u@YU})$sT_-d&SSgb4d_Y_*Y}z?QCOZc zV&#%9232}@V|}6w3w@|a$EJ7Sja{e8KnB4SSpsJR0+jfGZqkwEH~Zgf)?cS=S%el* z{v#(Si=f{Fs}DH4v1YCOD4RZk!`k80ZncG-{byI#C=07CQvu9CV`r_=ei?2_Ew!|E zwB&zTzyI#tyGBoAj{N!R*_A?zH_^Qb%}hOBfXYh4zIrVDO_UBU1>7l!R&=&+A=Del zfI&F{-Kf1FefZ^YYkFPls^R32E5aL?nSY=RE-hcxcsn|FE+*fqeea<|Re3JCQ!z8s z(;oYH>7HC3`YZX~_xLWNOaV~h_=1$XO}z=?z2%T>lB+R_imumvo*L=JS$Ckes_GT? z7BaY`O;-TBJOLdwJ(lQ+yPd zjMOE5A?cjW9C~5LfsTRtZ+2wYzh`l*;?J`Akmo_o8b26QjP&cAK%lVxDwx5W}OP zs)zuG6RHT<##c3=g0IkN^5^?-Jd{yYP)Ovaf1Dt`m;ir5xa8^XNpVKDG=mxOqKD)nYC4f2&|loRjUj54%i&v6RAvgZ=&e=)MqYmxh~M z;r5>_jQ|9CyhTuE9>vCLn3(K|k+hoJ`~Wm&s@Iz&^-FXwLGV4ugJGH ze{*I_a-O~SCg;0OwZPUxXr+h`liFu8c)m603*Wr?8tyFgMZ93Xanr~LmV^e3BjT_0 zWyra?zP`kvPM#9`u8$UkuDnwy$gx8rj2t5JRFrxno zR49XMpn^jCKn#`RF`;pzd;N(xClG|ngE(byiqTUrGB&=4g>u!ZBhD9g9}kZ0z;9lC z{1~JWBk8Jre$VE05c|w6Enj{9+-T{T6S?$jNatY5(n0EB_d-YK#fJ~oLpO+HihnLax&W1d{b&j-F%7g0Qa;KL;DB{@ zFXNb|8)`jjA(2i{)Id>Ryx2u(I0P01ittIHJcxO#S{q9q3YH!1K{FHznfp{p&e&lg zAqpWBfi5;SDj||UGNuz!px_&#%VTtB07u{wx(h^`pHOhnGupCc%Qz%pBMwI7apct? zM4XF8D@rQBC$=gFC<%a^y1vs^x|(Pv>3K|?BpO5&yx!G>OwGmh`qQUJ5Id)qpfTl# zcjr3Oo;-O%hynyngjI^jqQI^MQqONr&@>8jTVyWnfxP)9D=UIng=(=nm)&MJYNGpt z6mGrwwIhd3J#XrDiJ6aW%)U-X=2i3%k^z*;r*}Da$LGqAvYZ_J)-q9dTQaa-CFYGn zgZPf1FyJ&VuR_ur`j-D5E#1m0~zFGjY*&3Q0Bf zqsvZp6Hw=W!t6k_5s(=Xn7cTbvF=1W5BF;nXZCxPiOQwMqO8g3*rsn9`!Y^j(mR~)?l8!cqQrN*d+Y`d016>~ z19B&X(*}_8R6zF&Oo{Siy4{d-p;gwo8}~pl{?b+8Ua(vYWJhSUdJXwkV%+QGsc8P! z5h8!C8`v; zns+(?+Y-PF%#i&}!zC@OW%ybg8XB4m+Sjg)I9?XS0gfnI+=Kf53R}p*ov}Sg8GQpo zT&8Qa5&R2_3(ZAD%giWxgaF2dqVoD3Cd8uNbH#5XPaM0B&UJ&3E48bvxAODOMYexl+xEp zNtNzIqYL5D;X)2V13typNhl0Zcd=A)k%4GCpoyTjF&UMi|NE0|T#LPub@(gTxa`np zMpJSxwABk2`fDns;UxpORyh9Rk(7q7`)v&*rC+}$-|H`Zw{(L(`5Zz{jCHO*Vxpn7 zRn^@5fbeBYVee%RK@YKxYVUO(vlBf&3=ULe@aLs zIZz?p8Rtjf(x+leKlRQvQ;XX-(ve7oxb|*dr{}%oNa(9X zuYv~%SwxFL)ude#C)xvo(hZnyP+D*>BNaSzo3*U!U!H`bKnRsqRglh+cKZKw;ezYb&K>1{#6E*Pm5XF}BO!UxX3)N_KlRVQV4GiRR{i@6{D4G}|58zrSan z;`}qQx+DG2QNdfo~1_jg;2NSveN` z&XL9oC3*>Tq0;?M-Qxq=*>Hm9bIN3Gcqc1tjTRx{iNPAfk_KZ)hkeyytbmoeMjTmM zPxlD+6P>BQ-046EpFHO6Z4O4gdv}mH7jVDSy(<7JM3VOd7%qVBO7lSk7%dM@W=zvVHkF4wx-Y zqs~RI(2((7rg$sZkkpqxG&1ceHhTQAZl0SGn8^!wYk2Gy*jdNp-4*|SpiDlb z!-OdL-Ya7(CcqYQ2n52%VZ_LuO}S|?^1eN*>RJ|H?DBm4N)&u8UQ;pMpMXMbc;hVP z_bvn{@TB|C`ny}dsV(~JweMU}J6nM>Us6cAT4x*+ce}&ks!mg>xj=8L!L+bSexdwv zdIIu72<)#=Tu#*)&8gz_PR<_F;66oJ7IgHEf8SoN#1M7PlG-`;OX*cog>xmx%Gg9j ztGx24f;LH=_o+!e7>@kpc?lnL3y)pD^-h&LKh!FC{+j&`+g7Df%e|L12Q7Ps|L(4p zk|@jhW%<%7+H89g-L010(n#qhIh+K^B?i`WAtwgAE8-~>u|j=Iuxd!59>Ac(op})w zmcP!NJ=;6-YC_{rQXP{MLo1qngj|iLRhJo!Nn$B>h)a!|JO1DdmnyfX;Q$t?3-H)l1>+t#F|+|I&|9RD$45Qke6MPM@|)-<>Vc%bM`3rj^EeD zyWW%Df?o3quvzlY7@8taYw91ZTwbnw1C0CIlrvo$x(X3vNA&;DRhom9< zRKuC;idEto0Fs0^H(zBmXQ}#}ibWTCCwgLY{i9?itL}d5(l^6ohk~w=Tp~Gu707rk z&dKZ()mqAG7Z{RUS@2Lu(Or(oZgenwS)~85$L>J4$=s2~xG~1x_TQsz(ncdLGkP{O zSI%f*f~3#^-47R>>!g&FMA$q)7YGdr#Sb<2zbpwh%N0YZC-VMdVMDB^dz0^i@wg`C*^FEn;q7dXH>IT7=}jMJ2RC)wC?ts%8%iZC3)c75XuB0@xjxZU>+79U&pXP?x?4yJPBTn5Xt^yfkFCV>AOg;|nLyx0hP_aVz)A9ihA zOY{!mNu7g-=(rqDg&i00lZu_42thSr90J6CapHap#$bRn_{GGu?;iViJ7HC)4XyPR zVCRLp4q22apnz5&{16_%cfmU7zQJvYrNLnXb@elJsVR>5&V5aQxQ_@5?t`WDIp8%x zQql4em6KEF3+>S3lV6fiaUJ>oms|S6F*(+6*aCz(BVGITW z>YJPiu`W(Os(ztB>`nQo+3WkiLk~M@&(!=Mv|udeZ?>C)ja64y zi`*VRCq;B##l`!Y_zteZaMrh(Z+2X8UzZq+KQxZRMTOg_b#O7B;$M5e6dVRa9=OPL z*n=QI66&Q8iItg|uzCT5;XAX3O*;U_`9dF1ZT^jj<>;Z~qr*3L)t)pwHbx1O>LR-6 zpkP=L0*G_5YHMqs;NNVB%1aOjP{Fg8FMppPR}dx_Z(5eO8m84E3q2xo&%T={=Go>= z1!YJ`9MG#)C@YJ+s2hMg*kTATRX{`}g2)r(mKbpn)?jN8&q0eA?2)0iTWI{c*-lKT zJ$QZh(1pJypEELKuxh`5{|<0Ne;mip0pb~w3MeMTGEv|sR8!#{KOni)z{0D_zqzl! zpMX_x-d=FuhchsFI9;I1{gDcWq~0`>U;-r+zLqQp&r<||Oi-U#V9Kp2{LdVmPV*kE zRU--|An0M0efJ!ua* zqi3bX!pvM1C2$9}my4?mX>}le~G~l+EwQq zzVMU8P-7n#aWtT=DSRb8w_(X3*o+gZc3QN=4 zh|knZ%%ImW9o$~SLo$FMMx+CCd`b%P1~gv?`9!Wu zR9rd$%ElA~m2i<(v?2@blz-#ePjDVIt@{4@95KEb1-g!GT8&sAl3`7!-gM$L?=yhHmXMEj#6I}we69ag#0tDJhV~}#{%bUDK z2NvN?Ia~f+Kgvgz7s5QzpWL9h_z3pwG>ou~NhBQ`_IOd9CV;^gS5WdCuq;3=>7bw> zLfu7a5$1pq;|Xy}h+!LI;7U~Vj#c~D>mmYGUoZ{1M0c`qT@x{%t6t1<3pDDt?>0RH zSdWM{G#XD=$K}a6cTW&)W5@(%W^2Kb2>-2_*>lKJ*mZPbTF}SGfx`Hr9c)eb0h%dt zOVbU&W>-f#`I^@e6(MvTmDTQzWKC{O2C6SC*)XH| z0my}(+Q@pp65{{+_W{H}7sxki#a*)WBHZv5X#y$wJ$Rg?w{Hzf?yQCrO=9Ky>wk$V z>L?uKL=hkca`2ISAU`;D_HVfk(hjZizMmf>eAJrwtEHtSqUvHb2(1RR@KTmFH!()H zGUdIjg+-n3xx3+$6*j2?UQTKIzO{t)^1$K4Wn)xrJw4Vyze+IJG>GO{AOc~oTSZTK zW~$uxZ|wMi`c6O;umMcyp@eWLdU5%{eEQ?ZBOSHo#>RVA?E(-LQ0}4M!bO1QE_5^G zfIa9)oY}vs7~1N8+^$o&i!>NQ(&HxKW`_=pF}*OTFzGzI_DyPRx3aP#!YVs^&LSlM zwcOc{ER9D(ty0F(&a1wW*X>B>aM z_C<`3z>2z?Cq(e5cCRp&oiM#OBmIO(Ie=4 zgdrb0j+8bN`I(&Bt2adK3!$#cT-1l^fr8O(IYY;3aQ!iO=;3YQF5MK9WTXxoIszpT+o zVCGEgPHe&bZKO^g%G5kzS_EF~fkr|MfJHl~^~ruIp`#4Nh*XfCrFgNbN1kF{<6B%s z$*ymsYY25P?VsV9>Ro&A~B7Wl2Yd$L`x(~<3{*G zIntS_b!_`IKY7xeycQbb!Cc1V?>Be`J-90W%JHnEL#Ug09edKSGvJ&=+U3iuUk?5Iq?TPfKGq8r=Yd z9wr!x{tz)LGxxq|;gFn~6hgHt}RR#ktQ#^8+EZ1&K7V%^~E%gS<|KK9E?5ytlMJG!Q(d!a%T^A8BRe*liK z)$Cypu*0ClByzBuCk>rkf8|%je;Cp{72>yzVm$#Rf_VxBC%FxJ4BCzsYxx{YxFy+} zUT47hswUj;PS@+HR>^hB96V0ncGG8WP+!v?yIDDzN%_i^82E58AXL~k#AkmDV{RBe z7hr17EU+EWZ2wIS>1u$Z0%!+C5#+;F`%89BA?g(-UNQF%ir*k!V1m}!!omXjPbK0S zHc@<&BM!EJOuGi&DdFGlL5+8A74n(CGcmoLiAj3t=INrXvd{IXfJ zhm~t#(f`3WM>V951KZXcM@-Ueas>bnET1em5N`>g3|-NeVAQYsr=xr|GPrGS#L4=! zH&B7TB~{}0!jb>Hd4$qeuHg7Er|`etEE1*0vkF!`EF#`Y@N0Ves5mECML&0p!STa3 zP{*7$P)F$SH`@o`I=SWOh~Z&4=U|9$Vsg*4VuP&@BdUlHR7xad#H-J7;)N#Pnr=b+ zNE0Bm4>-?Nff&$OggOEdpNbE`zt_OSQzlIx* ztJntev$J#T;$mK19AJ1!{g!Te(8f%1sTSAWP4shXTO<>#dRI;NDXVJfZ#!`CN+C-^ zNi#K3f5g7R&Ni@qQorz;&bzc>&TD50{s=y#Da|zi3mzY!)UKM3OJW*qAOwaSMhlDA zY8k;8|A|lgne|RS9qHls6S>J0&-TUcrtM9Sr+2L`N&9(b=uF7g(utKQZ4+ydw0lNM zAp4AL@5H^nJk*^Af|)@3n53tzB3U;byCf;2L50 z^H%0}JIvY0&w9RX#<{~gieb|u>}i01^Sv9qzo98YhgnEIj4xswIwi^(IuaaVz)adpK2BD^W0qchun=wbSAy9B%GSp9zQlYNm=BD)gjrFx z%+%C$Gwb~e3@%Uh9F7S*%9t5iETX;`eAnN%Kj5yBfpo(6KTI+e2HQ&~jG|Np8u)zT z!#dPYuNNJc3HPS%vp;OhT+G<;`GJ$E;r9Kj^b8Z|68=8Yex#zON~cg7a$+;{)O!ZL z?x%-jF3qM5&|Ss-!A`;hV?P6y6)&POXqUvm>3?o1a1g`Ppsy6f<6beb zDbA0d@^;@6$#+xEyU!ub(Q;sAM}fq2l27)2Neq!L>MzxPx#cluC(Odh5MS%6s-`(e z{c5*QE$q?$D2DV`qS5t% zIyT|Lg_BB_MiSjx)U9>)>?UIFhJZFmk&pt>IUlDl;pQpr9j;tH|H5P9Tw_ky>iwXd}T<-NMlXDz7FF(7VRO(v~KW)`( zQ`LXf<^RMRs{U`*!TxvO%JtvznR7mn{z%uFc((KxY7q^Cy&)^-x)H&cs)Ho*1BNXq z55UoeU`t(=z>%<`;N@AH*874?{}-vn2y{ZyLmbLYq3`>{7{A40l%A~0q7*12WD=0Y{=0L(b!b3Cqno4l5% z;@Q@&%I|JPB5sFQOcWzz#QSt0&=5u@v`vhgldlnGO9@{>_3r%L!_fZKmf0hij#b*v z|J9uHwVXbZS@d3FiU@O(SRMn8^2lySCnr&`AdFG{v-M%X3VGrQ{KZi1eUA4?Xsy0Y z^c)IAIS*1&EF&b=ex*$HQfYNNs(aC{7#Z0E%TauMh*dj85xfusKmdN*rp-r!?{<5e z^QIKfb@uf5kUg%QMrl6PTEzM)vCt{|H817;RQGn;n@5Mf%?)~6pA0Jb6MuwWN5$e~ zyKydYn***o<-*L&r5y6+g$wRrhfAMQ=+UlJ#|SiDPJnmpnMd!?@OX0R=~9yjw|pU^ z-)Ub}Qx1dn9}S#)hMDiYak%zV`)8`~;c=Rkho|SewR4gjuc&hjOH2Gm@HmCk*GQJ5+^on*5U^|L$`KZ+mOT(PL4 z80URZ@WIe|{@m|?xg{^+JwA|RiP*w;_Vbr7?+~&BunQsU)W*sZBgVuiSz+O_#h6+Y zKkM^kZ=FZClkNHJn{qV97=yobI}U^~JU1bxlO_l!(NF;8;#t!hH!yR9btL97(M=-W z&Vuptw{QQ1sr-9U;6@m=(O;?5jW9=giE_Ar%m}P2j75 z(h337?}Y{5zY1pZlm59?yWS@_138I-D~Nu~jF@fwjoy?Yn*Bn4 zvpEOF1TUFdoK95SgBRxk^AZyd1GTYLcymTLd5F@Hs9n zN7-feH|$jVk(g=H9NeKlfBh;C*HR#ixx&nMF%TL~NM>kvtuD4~F=H#b%@FCgfmanN zwIrm!MY>$4$dRkRxXOSOYpySDalY9(oI2qbSY`H$E zGZnE_h;j)p=Kg(llQA;*Ze1pwyZE@wBXQ;X%yV2%PBaIoGWnpV$H53sCq#ABrw2g?Zvma0w25Ecy8dA=kU?k%v8$5a{JvkMIH^{>{)=ZA>68BfY|4V6%nfnC7V?y=rOq zs_J9H++6Cm0?fN_o8K?5-LM~JiKo+Bd2=aGc`6%+>Bb5tVdeLiPX2swH^^6GbCLP) zNQLXBg2%*yP3BTruCXQGduvobRK;h^2)3pkv$IFqi_1gDedcGF&Ta+&UAE`e+y;R7 zrxTH-Ya>5VSU1n_J=ERYtRlW6_H$5#8ad7%Z-63IKyehKA}S(UC^fuFKzV4f zHS%)63J6G23=%a2160tuB0dl+BFcawT2Lq*1;w`#FoA+1q6WnlXOIv}1ssOPs zIAxN3Cq0~d%<8)p?|&7LByi_d*GX?VYz}|ilrzc50B+t{1nOO*m&_Agc%pwm zh=Z1v0s#e*Z8Y)~+45P-2S4lM8gipt6jy}XcBhK}o~W}iuHPpxV2x_!C^pH@UF#0* z;VGm3(tjs`X+85}Hq*LGq%-1737Tj51G+jpL94?2`10PR|7>xG4M!q*1>h-bC}$bKfocg& z1bI>o*Axa#wN}|MfrHZWOdRyIa+Uu|=EA#U(EZ%HhHVH?Kxpnx^h+!!k}Jb1L{MOo`ymS7+)8T1unNFPvZOcwdeQmbiv8s6QN{z~% zV?tfj&13JSo!54^eZ9h`?s4u+hWK<>uMUQnnj|)!SuK4bss}mrd4E+wrK=ojxXV^) zAz?{#>tun}=U`fnj(3RsaNHBE3mxKu7jc!Vxgyz`cKMM<&xXyq_OYPAZW+G`To zFX4bhq63HtBZVW{2iw}AqBWuk4MCX_Hf3QQ-{{E$Px8czRwV3M@^VACiE%B_10Z2& z9ZF7|GVI6~)el<~R#xVdD*?2K^Q2Q>%oXlUNnW&e(nRF{UNi?%{|03XAzr8!AHthY zy#r|G%XQhjW6a!^zumV{<1NwKh9dwe74#cw_*pb{15E%rq7DETUB~p{C2*rbIVCLQ z^MVoIbvX~BKWxk>&Pehg9OK%V;A4F?Lpk|^I3Me(tel*r6^xVdc6h2V>BsCCdb{W_ zv}r8q`f(fy1q8;!vbj5ey(IAGC$X{VvCc~&p+H#+{{ePn;%wC+@&+E}z|hZ13f59; z9~SJ$-nLmJcUP2L*?1FCF~aTuNXl+@CO{CyS&{uA(to;`bTQvgRTIt>W^v z2~CwNJd2D2&Rh+SJ6uX=n#7|ydmul*bm)C6(JhWKF%rOLnL~&iBxwmz18)_E16-R3 z63)(dm5|DaOg=1*l>f%MwF+J+NN{Hm8w9503VZ?-$N?x1X*PtzGBKpg1u+NjRj5!{ zf|LiKR8!KKDv#7D3)8p}m0 zIb=ToCqwIkD~E*dS`I-hb*kZkKx_!4n*-FID#WSEqLk{MbbG5OJvfY%zU9~G;k=Jz z&e4<~!BzEl6?_G=9f*=yFdo8%cpC~55(%In0B;ElZ6VGWVs^+x5OhF?;LtmEcG0ke zU{3R_%WF7~eCEOktOSrh;19m+qk!3Drx*^FyCw$vc|}u3PFb~whX*Wbkd;T^mY$z6 z1j@?^Sv7OYUWD!mNDLCjv(f$=mmd|kl3^D~rn#kd~lY^l5-@0%Xw-EG;lXu=>GV%a_Bpa5|rQ z!Vo64q^b(12gDp3ph=xyC8y5gb09TEVeZSuwH#6gkd{Wi z0)rKc@=h4ZNRUVIiR$&AxWAP0)A)p}WkErUaI3)1Xl!Z$C_m#_tnn3l1JTQR^el&pO0$ao(1V8Q}@5fU1?ctYU(>}a2+hZPiw`;lZJm#v`p*o$+QiK zwDES#vt}FX6}eWN*zSQaLH|Kn|0Kdq0lrnAF~htfLVm8n1w{i_I6Y9idh`9V5-fJX5epUq>{(xymSS9c(%sF64+3$zjv z(gK4$;2w~Sv4DkK0oBnB=oMV8usk(2je|kI2nbNjCCaCtg{ty}Z4fYf5UG(}L)k`t z8J%zxKQd##n(LF}wy375x81_n@S6d<><=%SNpGW`(Ex+Oi?b{eiH^bHgS(2Z9sa)&2slu zi13m)0a^jT;BU6vP<#a80MV z`ygyj1`_~13A7*GIcGw}gv<_dApn~gE0+FQYPOLg$iI0e$9zx9mKVrOhs=d83XuuC z3S&d0X_!@BN0Jx7i=bAu)q6r;Mq(Pi8r)*u`y$5kT;tk3*!I4Ve-ZA2iD<^Sr=1-M zQ9S`m3;b;0o?TU;mpsUVlP6aQv;%7^{!TEi$&wC7lMl$oxog7A&xYQby5N93;_|KF z3hOs*M*h{(-VI}va4c$iP6!_I*+vHF9jbeRKR6;fOdJI5hEX|))|IzwDlB`fty+}# zwNGs!kM9o)31naUJj-#5EjhXoQB-^?5qdfXfneAWRWf$_^rCSwEsyiW>a2@6ppEUjd z^>qAx7BtiRR=VY!c=N4-Arx|qHw~+UR8!zSG^@CSJ}Ih`*qnNxxa0r$1uA@jKOc)ti&Vz z%ff%!=hdTrA?uHKEY$mbYyG8#`oBMC4bg7hv2}OwFgtN^XyR%?qR>5BD#Qch$Z>SC z=eXKCa+W)|xjQ?$J2~5NIPM&dEUQxc#tvf1YEewef8W9Mwtg^nFr(ifOcuqse;`>e zkp{;LqJ@mZ*nB-6UL61W#l_enFeWBJn8>(s!ZOtPZ@d~P6$#@K1&Ja_9ODrC(X8uu zmHm3(Wuj!^`cNN{SQwW;TX3BnYg5~A{^vGfe{AF8z_~V$n}%%|-r@kC(~J1qegznd B;79-f literal 0 HcmV?d00001 diff --git a/assets/images/2023-7-25-announcing-ccp-based-s3-io-datapipes-3.png b/assets/images/2023-7-25-announcing-ccp-based-s3-io-datapipes-3.png new file mode 100644 index 0000000000000000000000000000000000000000..a21d8bb8b08cf299798b2f5a6f20b2396ed47c94 GIT binary patch literal 32988 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 K{Xo;|{Qm$;H`DY0 literal 0 HcmV?d00001 diff --git a/assets/images/2023-7-25-announcing-ccp-based-s3-io-datapipes-4.png b/assets/images/2023-7-25-announcing-ccp-based-s3-io-datapipes-4.png new file mode 100644 index 0000000000000000000000000000000000000000..15de2d1a79fb345e3c7dc9dc9ce4b813a40365b2 GIT binary patch literal 33722 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 literal 0 HcmV?d00001 diff --git a/assets/images/2023-7-25-announcing-ccp-based-s3-io-datapipes-5.png b/assets/images/2023-7-25-announcing-ccp-based-s3-io-datapipes-5.png new file mode 100644 index 0000000000000000000000000000000000000000..2aaa9ccb08a67e3844269e055b10590e2f7f95b9 GIT binary patch literal 49513 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 Date: Tue, 25 Jul 2023 14:32:20 -0400 Subject: [PATCH 3/8] tweaking blog url --- ...cing-cpp-based-s3-io-0-datapipes => 2023-07-25-announcing-cpp} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename _posts/{2023-07-25-announcing-cpp-based-s3-io-0-datapipes => 2023-07-25-announcing-cpp} (100%) diff --git a/_posts/2023-07-25-announcing-cpp-based-s3-io-0-datapipes b/_posts/2023-07-25-announcing-cpp similarity index 100% rename from _posts/2023-07-25-announcing-cpp-based-s3-io-0-datapipes rename to _posts/2023-07-25-announcing-cpp From ef55b053c78263b365ff2175bea311be600993e7 Mon Sep 17 00:00:00 2001 From: Alena Davis Date: Tue, 25 Jul 2023 14:48:04 -0400 Subject: [PATCH 4/8] fixed date --- _posts/{2023-07-25-announcing-cpp => 2023-07-24-announcing-cpp} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename _posts/{2023-07-25-announcing-cpp => 2023-07-24-announcing-cpp} (100%) diff --git a/_posts/2023-07-25-announcing-cpp b/_posts/2023-07-24-announcing-cpp similarity index 100% rename from _posts/2023-07-25-announcing-cpp rename to _posts/2023-07-24-announcing-cpp From eb746af7fac0b06659c5f0033421913c963d7c3d Mon Sep 17 00:00:00 2001 From: Alena Davis Date: Tue, 25 Jul 2023 15:01:01 -0400 Subject: [PATCH 5/8] fixing url --- .../{2023-07-24-announcing-cpp => 2023-07-24-announcing-cpp.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename _posts/{2023-07-24-announcing-cpp => 2023-07-24-announcing-cpp.md} (100%) diff --git a/_posts/2023-07-24-announcing-cpp b/_posts/2023-07-24-announcing-cpp.md similarity index 100% rename from _posts/2023-07-24-announcing-cpp rename to _posts/2023-07-24-announcing-cpp.md From ce874555d5c1937b908dfd76e022210885b5b93f Mon Sep 17 00:00:00 2001 From: Alena Davis Date: Tue, 25 Jul 2023 15:13:04 -0400 Subject: [PATCH 6/8] Fixing image markdown --- _posts/2023-07-24-announcing-cpp.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/_posts/2023-07-24-announcing-cpp.md b/_posts/2023-07-24-announcing-cpp.md index c488b7b2de38..92c9537434fc 100644 --- a/_posts/2023-07-24-announcing-cpp.md +++ b/_posts/2023-07-24-announcing-cpp.md @@ -77,24 +77,24 @@ The S3 data in the test is a sharded text dataset. Each shard has about 100,000 The following chart reports the throughput comparison for various batch sizes for **num_workers=0**, the data loader runs in the main process. **S3FileLoader** has higher queries per second (QPS). It is 90% higher than **fsspec** at batch size 512. -(/assets/images/2023-7-25-announcing-ccp-based-s3-io-datapipes-1.png){:style="max-width:620px; width:100%; display: block; margin-left: auto; margin-right: auto"} +![Batch Sizes 1](/assets/images/2023-7-25-announcing-ccp-based-s3-io-datapipes-1.png){:style="max-width:620px; width:100%; display: block; margin-left: auto; margin-right: auto"} The following chart reports the results for **num_workers=4**, the data loaders runs in the main process. **S3FileLoader** is 59.8% higher than **fsspec** at batch size 512. -(/assets/images/2023-7-25-announcing-ccp-based-s3-io-datapipes-5.png){:style="max-width:620px; width:100%; display: block; margin-left: auto; margin-right: auto"} +![Batch Sizes 2](/assets/images/2023-7-25-announcing-ccp-based-s3-io-datapipes-5.png){:style="max-width:620px; width:100%; display: block; margin-left: auto; margin-right: auto"} ### Training ResNet50 Model against Boto3 For the following chart, we trained a ResNet50 model on a cluster of 4 p3.16xlarge instances with a total 32 GPUs. The training dataset is ImageNet with 1.2 million images organized into 1,000-image shards. The training batch size is 64. The training time is measured in seconds. For eight epochs, **S3FileLoader** is 7.5% faster than Boto3. -(/assets/images/2023-7-25-announcing-ccp-based-s3-io-datapipes-2.png){:style="max-width:620px; width:100%; display: block; margin-left: auto; margin-right: auto"} +![Boto3](/assets/images/2023-7-25-announcing-ccp-based-s3-io-datapipes-2.png){:style="max-width:620px; width:100%; display: block; margin-left: auto; margin-right: auto"} ### Training a Bert model against Boto3 For the following cart, we trained a Bert model on a cluster of 4 p3.16xlarge instances with a total 32 GPUs. The training corpus has 1474 files. Each file has around 150,000 samples. To run a shorter epoch, we use 0.05% (approximately 75 samples) per file. The batch size is 2,048. The training time is measured in seconds. For one epoch, **S3FileLoader** is 7% faster than Boto3. -(/assets/images/2023-7-25-announcing-ccp-based-s3-io-datapipes-3.png){:style="max-width:620px; width:100%; display: block; margin-left: auto; margin-right: auto"} +![Boto3 2](/assets/images/2023-7-25-announcing-ccp-based-s3-io-datapipes-3.png){:style="max-width:620px; width:100%; display: block; margin-left: auto; margin-right: auto"} ### Comparison against the original PyTorch S3 plugin The new PyTorch S3 DataPipes perform substantially better than the original [PyTorch S3 plugin](https://github.com/aws/amazon-s3-plugin-for-pytorch). We have tuned the internal buffer size for **S3FileLoader**. The loading time is measured in seconds. @@ -105,7 +105,7 @@ For the 10 sharded charades files (approximately 1.5 GiB each), **S3FileLoader** Training large deep learning models may require a massive compute cluster with tens or even hundreds of nodes. Each node in the cluster may generate a large number of data loading requests that hit a specific S3 shard. To avoid throttle, we recommend sharding training data across S3 buckets and S3 folders. -(/assets/images/2023-7-25-announcing-ccp-based-s3-io-datapipes-4.png){:style="max-width:620px; width:100%; display: block; margin-left: auto; margin-right: auto"} +![Best Practices](/assets/images/2023-7-25-announcing-ccp-based-s3-io-datapipes-4.png){:style="max-width:620px; width:100%; display: block; margin-left: auto; margin-right: auto"} To achieve good performance, it helps to have file sizes that are big enough to parallelize across a given file, but not so big that we hit the limits of throughput on that object on Amazon S3 depending on the training job. The optimal size can be between 50–200 MB. From 9b6c85042e57f114539aa5fe8cf4ac1a84fd3663 Mon Sep 17 00:00:00 2001 From: Alena Davis Date: Tue, 25 Jul 2023 15:13:34 -0400 Subject: [PATCH 7/8] changing date back to today --- ...{2023-07-24-announcing-cpp.md => 2023-07-25-announcing-cpp.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename _posts/{2023-07-24-announcing-cpp.md => 2023-07-25-announcing-cpp.md} (100%) diff --git a/_posts/2023-07-24-announcing-cpp.md b/_posts/2023-07-25-announcing-cpp.md similarity index 100% rename from _posts/2023-07-24-announcing-cpp.md rename to _posts/2023-07-25-announcing-cpp.md From 2c66f4d782f5d8ae1f2d98d0a9570c9bfc9daf13 Mon Sep 17 00:00:00 2001 From: Alena Davis Date: Tue, 25 Jul 2023 15:19:56 -0400 Subject: [PATCH 8/8] fixed more markdown --- _posts/2023-07-25-announcing-cpp.md | 40 ++++++++++++++--------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/_posts/2023-07-25-announcing-cpp.md b/_posts/2023-07-25-announcing-cpp.md index 92c9537434fc..f9d0c26138f6 100644 --- a/_posts/2023-07-25-announcing-cpp.md +++ b/_posts/2023-07-25-announcing-cpp.md @@ -6,42 +6,42 @@ author: John He, Khaled ElGalaind Roshani Nagmote, Daiming Yang Training large deep learning models requires large datasets. [Amazon Simple Storage Service](https://aws.amazon.com/s3/) (Amazon S3) is a scalable cloud object store service used for storing large training datasets. Machine learning (ML) practitioners need an efficient data pipe that can download data from Amazon S3, transform the data, and feed the data to GPUs for training models with high throughput and low latency. -In this post, we introduce the new S3 IO DataPipes for PyTorch, [S3FileLister](hhttps://github.com/pytorch/data/blob/main/torchdata/datapipes/iter/load/s3io.py#L19) and [S3FileLoader](https://github.com/pytorch/data/blob/main/torchdata/datapipes/iter/load/s3io.py#L106). For memory efficiency and fast runs, the new DataPipes use the C++ extension to access Amazon S3. Benchmarking shows that S3FileLoader is 59.8% faster than [FSSpecFileOpener](https://github.com/pytorch/data/blob/main/torchdata/datapipes/iter/load/fsspec.py#L125) for downloading a natural language processing (NLP) dataset from Amazon S3. You can build [IterDataPipe](https://pytorch.org/data/beta/torchdata.datapipes.iter.html) training pipelines with the new DataPipes. We also demonstrate that the new DataPipe can reduce overall Bert and ResNet50 training time by 7%. The new DataPipes have been upstreamed to the open-source [TorchData 0.4.0](https://github.com/pytorch/data/releases/tag/v0.4.0) with [PyTorch 1.12.0](https://github.com/pytorch/pytorch/releases/tag/v1.12.0). +In this post, we introduce the new S3 IO DataPipes for PyTorch, [`S3FileLister`](hhttps://github.com/pytorch/data/blob/main/torchdata/datapipes/iter/load/s3io.py#L19) and [`S3FileLoader`](https://github.com/pytorch/data/blob/main/torchdata/datapipes/iter/load/s3io.py#L106). For memory efficiency and fast runs, the new DataPipes use the C++ extension to access Amazon S3. Benchmarking shows that `S3FileLoader` is 59.8% faster than [`FSSpecFileOpener`](https://github.com/pytorch/data/blob/main/torchdata/datapipes/iter/load/fsspec.py#L125) for downloading a natural language processing (NLP) dataset from Amazon S3. You can build [IterDataPipe](https://pytorch.org/data/beta/torchdata.datapipes.iter.html) training pipelines with the new DataPipes. We also demonstrate that the new DataPipe can reduce overall Bert and ResNet50 training time by 7%. The new DataPipes have been upstreamed to the open-source [`TorchData 0.4.0`](https://github.com/pytorch/data/releases/tag/v0.4.0) with [PyTorch 1.12.0](https://github.com/pytorch/pytorch/releases/tag/v1.12.0). ## Overview -Amazon S3 is a scalable cloud storage service with no limit on data volume. Loading data from Amazon S3 and feeding the data to high-performance GPUs such as NVIDIA A100 can be challenging. It requires an efficient data pipeline that can meet the data processing speed of GPUs. To help with this, we released a new high performance tool for PyTorch: S3 IO DataPipes. DataPipes are subclassed from **torchdata.datapipes.iter.IterDataPipe**, so they can interact with the **IterableDataPipe** interface. Developers can quickly build their DataPipe DAGs to access, transform, and manipulate data with shuffle, sharding, and batch features. +Amazon S3 is a scalable cloud storage service with no limit on data volume. Loading data from Amazon S3 and feeding the data to high-performance GPUs such as NVIDIA A100 can be challenging. It requires an efficient data pipeline that can meet the data processing speed of GPUs. To help with this, we released a new high performance tool for PyTorch: S3 IO DataPipes. DataPipes are subclassed from `torchdata.datapipes.iter.IterDataPipe`, so they can interact with the `IterableDataPipe` interface. Developers can quickly build their DataPipe DAGs to access, transform, and manipulate data with shuffle, sharding, and batch features. The new DataPipes are designed to be file format agnostic and Amazon S3 data is downloaded as binary large objects (BLOBs). It can be used as a composable building block to assemble a DataPipe graph that can load tabular, NLP, and computer vision (CV) data into your training pipelines. Under the hood, the new S3 IO DataPipes employ a C++ S3 handler with the AWS C++ SDK. In general, a C++ implementation is more memory efficient and has better CPU core usage (no Global Interpreter Lock) in threading compared to Python. The new C++ S3 IO DataPipes are recommended for high throughput, low latency data loading in training large deep learning models. The new S3 IO DataPipes provide two first-class citizen APIs: -* **S3FileLister** – Iterable that lists S3 file URLs within the given S3 prefixes. The functional name for this API is **list_files_by_s3**. -* **S3FileLoader** – Iterable that loads S3 files from the given S3 prefixes. The functional name for this API is **load_files_by_s3**. +* **S3FileLister** – Iterable that lists S3 file URLs within the given S3 prefixes. The functional name for this API is `list_files_by_s3`. +* **S3FileLoader** – Iterable that loads S3 files from the given S3 prefixes. The functional name for this API is `load_files_by_s3`. ## Usage -In this section, we provide instructions for using the new S3 IO DataPipes. We also provide a code snippet for **load_files_by_s3()**. +In this section, we provide instructions for using the new S3 IO DataPipes. We also provide a code snippet for `load_files_by_s3()`. ### Build from source -The new S3 IO DataPipes use the C++ extension. It is built into the **torchdata** package by default. However, if the new DataPipes are not available within the environment, for example Windows on Conda, you need to build from the source. For more information, refer to [Iterable Datapipes](https://github.com/pytorch/data/tree/main/torchdata/datapipes/iter/load#s3-io-datapipe-documentation). +The new S3 IO DataPipes use the C++ extension. It is built into the `torchdata` package by default. However, if the new DataPipes are not available within the environment, for example Windows on Conda, you need to build from the source. For more information, refer to [Iterable Datapipes](https://github.com/pytorch/data/tree/main/torchdata/datapipes/iter/load#s3-io-datapipe-documentation). ### Configuration -Amazon S3 supports global buckets. However, a bucket is created within a Region. You can pass a Region to the DataPipes by using **__init__()**. Alternatively, you can either **export AWS_REGION=us-west-2** into your shell or set an environment variable with **os.environ['AWS_REGION'] = 'us-east-1'** in your code. +Amazon S3 supports global buckets. However, a bucket is created within a Region. You can pass a Region to the DataPipes by using `__init__()`. Alternatively, you can either `export AWS_REGION=us-west-2` into your shell or set an environment variable with `os.environ['AWS_REGION'] = 'us-east-1'` in your code. To read objects in a bucket that aren’t publicly accessible, you must provide AWS credentials through one of the following methods: -* [Install and configure](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html) the [AWS Command Line Interface](aws.amazon.com/cli) (AWS CLI) with **AWS configure** -* Set credentials in the AWS credentials profile file on the local system, located at **~/.aws/credentials** on Linux, macOS, or Unix -* Set the **AWS_ACCESS_KEY_ID** and **AWS_SECRET_ACCESS_KEY** environment variables +* [Install and configure](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html) the [AWS Command Line Interface](aws.amazon.com/cli) (AWS CLI) with `AWS configure` +* Set credentials in the AWS credentials profile file on the local system, located at `~/.aws/credentials` on Linux, macOS, or Unix +* Set the `AWS_ACCESS_KEY_ID` and `AWS_SECRET_ACCESS_KEY` environment variables * If you’re using this library on an [Amazon Elastic Compute Cloud](aws.amazon.com/ec2) (Amazon EC2) instance, specify an [AWS Identity and Access Management](aws.amazon.com/iam) (IAM) role and then give the EC2 instance access to that role ### Example code -The following code snippet provides a typical usage of **load_files_by_s3()**: +The following code snippet provides a typical usage of `load_files_by_s3()`: ``` @@ -70,36 +70,36 @@ In this section, we demonstrate how the new DataPipe can reduce overall Bert and ### Isolated DataLoader performance evaluation against FSSpec -**FSSpecFileOpener** is another PyTorch S3 DataPipe. It uses **botocore** and **aiohttp/asyncio** to access S3 data. The following is the performance test setup and result (quoted from [Performance Comparison between native AWSSDK and FSSpec (boto3) based DataPipes](https://github.com/pytorch/data/issues/500)). +`FSSpecFileOpener` is another PyTorch S3 DataPipe. It uses `botocore` and `aiohttp/asyncio` to access S3 data. The following is the performance test setup and result (quoted from [Performance Comparison between native AWSSDK and FSSpec (boto3) based DataPipes](https://github.com/pytorch/data/issues/500)). The S3 data in the test is a sharded text dataset. Each shard has about 100,000 lines and each line is around 1.6 KB, making each shard about 156 MB. The measurements in this benchmark are averaged over 1,000 batches. No shuffling, sampling, or transforms were performed. -The following chart reports the throughput comparison for various batch sizes for **num_workers=0**, the data loader runs in the main process. **S3FileLoader** has higher queries per second (QPS). It is 90% higher than **fsspec** at batch size 512. +The following chart reports the throughput comparison for various batch sizes for `num_workers=0`, the data loader runs in the main process. `S3FileLoader` has higher queries per second (QPS). It is 90% higher than `fsspec` at batch size 512. ![Batch Sizes 1](/assets/images/2023-7-25-announcing-ccp-based-s3-io-datapipes-1.png){:style="max-width:620px; width:100%; display: block; margin-left: auto; margin-right: auto"} -The following chart reports the results for **num_workers=4**, the data loaders runs in the main process. **S3FileLoader** is 59.8% higher than **fsspec** at batch size 512. +The following chart reports the results for `num_workers=4`, the data loaders runs in the main process. `S3FileLoader` is 59.8% higher than `fsspec` at batch size 512. ![Batch Sizes 2](/assets/images/2023-7-25-announcing-ccp-based-s3-io-datapipes-5.png){:style="max-width:620px; width:100%; display: block; margin-left: auto; margin-right: auto"} ### Training ResNet50 Model against Boto3 -For the following chart, we trained a ResNet50 model on a cluster of 4 p3.16xlarge instances with a total 32 GPUs. The training dataset is ImageNet with 1.2 million images organized into 1,000-image shards. The training batch size is 64. The training time is measured in seconds. For eight epochs, **S3FileLoader** is 7.5% faster than Boto3. +For the following chart, we trained a ResNet50 model on a cluster of 4 p3.16xlarge instances with a total 32 GPUs. The training dataset is ImageNet with 1.2 million images organized into 1,000-image shards. The training batch size is 64. The training time is measured in seconds. For eight epochs, `S3FileLoader` is 7.5% faster than Boto3. ![Boto3](/assets/images/2023-7-25-announcing-ccp-based-s3-io-datapipes-2.png){:style="max-width:620px; width:100%; display: block; margin-left: auto; margin-right: auto"} ### Training a Bert model against Boto3 -For the following cart, we trained a Bert model on a cluster of 4 p3.16xlarge instances with a total 32 GPUs. The training corpus has 1474 files. Each file has around 150,000 samples. To run a shorter epoch, we use 0.05% (approximately 75 samples) per file. The batch size is 2,048. The training time is measured in seconds. For one epoch, **S3FileLoader** is 7% faster than Boto3. +For the following cart, we trained a Bert model on a cluster of 4 p3.16xlarge instances with a total 32 GPUs. The training corpus has 1474 files. Each file has around 150,000 samples. To run a shorter epoch, we use 0.05% (approximately 75 samples) per file. The batch size is 2,048. The training time is measured in seconds. For one epoch, `S3FileLoader` is 7% faster than Boto3. ![Boto3 2](/assets/images/2023-7-25-announcing-ccp-based-s3-io-datapipes-3.png){:style="max-width:620px; width:100%; display: block; margin-left: auto; margin-right: auto"} ### Comparison against the original PyTorch S3 plugin -The new PyTorch S3 DataPipes perform substantially better than the original [PyTorch S3 plugin](https://github.com/aws/amazon-s3-plugin-for-pytorch). We have tuned the internal buffer size for **S3FileLoader**. The loading time is measured in seconds. +The new PyTorch S3 DataPipes perform substantially better than the original [PyTorch S3 plugin](https://github.com/aws/amazon-s3-plugin-for-pytorch). We have tuned the internal buffer size for `S3FileLoader`. The loading time is measured in seconds. -For the 10 sharded charades files (approximately 1.5 GiB each), **S3FileLoader** was 3.5 times faster in our experiments. +For the 10 sharded charades files (approximately 1.5 GiB each), `S3FileLoader` was 3.5 times faster in our experiments. ### Best practices Training large deep learning models may require a massive compute cluster with tens or even hundreds of nodes. Each node in the cluster may generate a large number of data loading requests that hit a specific S3 shard. To avoid throttle, we recommend sharding training data across S3 buckets and S3 folders. @@ -112,7 +112,7 @@ To achieve good performance, it helps to have file sizes that are big enough to ## Conclusion and next steps -In this post, we introduced you to the new PyTorch IO DataPipes. The new DataPipes use **aws-sdk-cpp** and show better performance against Boto3-based data loaders. +In this post, we introduced you to the new PyTorch IO DataPipes. The new DataPipes use `aws-sdk-cpp` and show better performance against Boto3-based data loaders. For next steps, we plan to improve on usability, performance, and functionality by focusing on the following features: @@ -121,7 +121,7 @@ For next steps, we plan to improve on usability, performance, and functionality * **Local caching** – We plan on making model training able to traverse the training dataset for multiple passes. Local caching after the first epoch can cut out time of flight delays from Amazon S3, which can substantially accelerate data retrieval time for subsequent epochs. * **Customizable configuration** – We plan to expose more parameters such as internal buffer size, multi-part chunk size, and executor count and allow users to further tune data loading efficiency. * **Amazon S3 upload** – We plan to expand the S3 DataPipes to support upload for checkpointing. -* **Merge with fsspec** – **fsspec** is used in other systems such as **torch.save()**. We can integrate the new S3 DataPipes with **fsspec** so they can have more use cases. +* **Merge with fsspec** – `fsspec` is used in other systems such as `torch.save()`. We can integrate the new S3 DataPipes with `fsspec` so they can have more use cases.