Skip to content

Commit

Permalink
PyTorch v2.0 ๋ฐ˜์˜, pytorch/tutorials@9efe789b (#626)
Browse files Browse the repository at this point in the history
  • Loading branch information
9bow committed May 6, 2023
1 parent e5a6705 commit 92b69bc
Show file tree
Hide file tree
Showing 190 changed files with 8,384 additions and 8,589 deletions.
107 changes: 107 additions & 0 deletions .build/get_files_to_run.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
from typing import Any, Dict, List, Optional, Tuple
import json
import os
from pathlib import Path
# from remove_runnable_code import remove_runnable_code


# Calculate repo base dir
REPO_BASE_DIR = Path(__file__).absolute().parent.parent


def get_all_files() -> List[str]:
sources = [x.relative_to(REPO_BASE_DIR) for x in REPO_BASE_DIR.glob("*_source/**/*.py") if 'data' not in x.parts]
return [str(x) for x in sources]


def read_metadata() -> Dict[str, Any]:
with (REPO_BASE_DIR / ".jenkins" / "metadata.json").open() as fp:
return json.load(fp)


def calculate_shards(all_files: List[str], num_shards: int = 20) -> List[List[str]]:
sharded_files: List[Tuple[float, List[str]]] = [(0.0, []) for _ in range(num_shards)]
metadata = read_metadata()

def get_duration(file: str) -> int:
# tutorials not listed in the metadata.json file usually take
# <3min to run, so we'll default to 1min if it's not listed
return metadata.get(file, {}).get("duration", 60)

def get_needs_machine(file: str) -> Optional[str]:
return metadata.get(file, {}).get("needs", None)

def add_to_shard(i, filename):
shard_time, shard_jobs = sharded_files[i]
shard_jobs.append(filename)
sharded_files[i] = (
shard_time + get_duration(filename),
shard_jobs,
)

all_other_files = all_files.copy()
needs_gpu_nvidia_small_multi = list(
filter(lambda x: get_needs_machine(x) == "gpu.nvidia.small.multi", all_files,)
)
needs_gpu_nvidia_medium = list(
filter(lambda x: get_needs_machine(x) == "gpu.nvidia.large", all_files,)
)
for filename in needs_gpu_nvidia_small_multi:
# currently, the only job that uses gpu.nvidia.small.multi is the 0th worker,
# so we'll add all the jobs that need this machine to the 0th worker
add_to_shard(0, filename)
all_other_files.remove(filename)
for filename in needs_gpu_nvidia_medium:
# currently, the only job that uses gpu.nvidia.large is the 1st worker,
# so we'll add all the jobs that need this machine to the 1st worker
add_to_shard(1, filename)
all_other_files.remove(filename)

sorted_files = sorted(all_other_files, key=get_duration, reverse=True,)

for filename in sorted_files:
min_shard_index = sorted(range(num_shards), key=lambda i: sharded_files[i][0])[
0
]
add_to_shard(min_shard_index, filename)
return [x[1] for x in sharded_files]


def compute_files_to_keep(files_to_run: List[str]) -> List[str]:
metadata = read_metadata()
files_to_keep = list(files_to_run)
for file in files_to_run:
extra_files = metadata.get(file, {}).get("extra_files", [])
files_to_keep.extend(extra_files)
return files_to_keep


def remove_other_files(all_files, files_to_keep) -> None:

for file in all_files:
if file not in files_to_keep:
remove_runnable_code(file, file)


def parse_args() -> Any:
from argparse import ArgumentParser
parser = ArgumentParser("Select files to run")
parser.add_argument("--dry-run", action="store_true")
parser.add_argument("--num-shards", type=int, default=int(os.environ.get("NUM_WORKERS", 20)))
parser.add_argument("--shard-num", type=int, default=int(os.environ.get("WORKER_ID", 0)))
return parser.parse_args()


def main() -> None:
args = parse_args()

all_files = get_all_files()
files_to_run = calculate_shards(all_files, num_shards=args.num_shards)[args.shard_num]
if not args.dry_run:
remove_other_files(all_files, compute_files_to_keep(files_to_run))
stripped_file_names = [Path(x).stem for x in files_to_run]
print(" ".join(stripped_file_names))


if __name__ == "__main__":
main()
13 changes: 13 additions & 0 deletions .build/get_sphinx_filenames.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
from pathlib import Path
from typing import List

from get_files_to_run import get_all_files
from validate_tutorials_built import NOT_RUN


def get_files_for_sphinx() -> List[str]:
all_py_files = get_all_files()
return [x for x in all_py_files if all(y not in x for y in NOT_RUN)]


SPHINX_SHOULD_RUN = "|".join(get_files_for_sphinx())
89 changes: 43 additions & 46 deletions .build/validate_tutorials_built.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,51 +9,49 @@
# the file name to explain why, like intro.html), or fix the tutorial and remove it from this list).

NOT_RUN = [
"basics/intro", # no code
"translation_transformer",
"profiler",
"saving_loading_models",
"introyt/captumyt",
"introyt/trainingyt",
"examples_nn/polynomial_module",
"examples_nn/dynamic_net",
"examples_nn/polynomial_optim",
"former_torchies/autograd_tutorial_old",
"former_torchies/tensor_tutorial_old",
"examples_autograd/polynomial_autograd",
"examples_autograd/polynomial_custom_function",
"parametrizations",
"mnist_train_nas", # used by ax_multiobjective_nas_tutorial.py
"fx_conv_bn_fuser",
"super_resolution_with_onnxruntime",
"ddp_pipeline", # requires 4 gpus
"fx_graph_mode_ptq_dynamic",
"vmap_recipe",
"torchscript_freezing",
"nestedtensor",
"recipes/saving_and_loading_models_for_inference",
"recipes/saving_multiple_models_in_one_file",
"recipes/loading_data_recipe",
"recipes/tensorboard_with_pytorch",
"recipes/what_is_state_dict",
"recipes/profiler_recipe",
"recipes/save_load_across_devices",
"recipes/warmstarting_model_using_parameters_from_a_different_model",
"recipes/dynamic_quantization",
"recipes/saving_and_loading_a_general_checkpoint",
"recipes/benchmark",
"recipes/tuning_guide",
"recipes/zeroing_out_gradients",
"recipes/defining_a_neural_network",
"recipes/timer_quick_start",
"recipes/amp_recipe",
"recipes/Captum_Recipe",
"hyperparameter_tuning_tutorial",
"flask_rest_api_tutorial",
"text_to_speech_with_torchaudio",
"beginner_source/basics/intro", # no code
"beginner_source/translation_transformer",
"beginner_source/profiler",
"beginner_source/saving_loading_models",
"beginner_source/introyt/captumyt",
"beginner_source/examples_nn/polynomial_module",
"beginner_source/examples_nn/dynamic_net",
"beginner_source/examples_nn/polynomial_optim",
"beginner_source/former_torchies/autograd_tutorial_old",
"beginner_source/former_torchies/tensor_tutorial_old",
"beginner_source/examples_autograd/polynomial_autograd",
"beginner_source/examples_autograd/polynomial_custom_function",
"intermediate_source/parametrizations",
"intermediate_source/mnist_train_nas", # used by ax_multiobjective_nas_tutorial.py
"intermediate_source/fx_conv_bn_fuser",
"advanced_source/super_resolution_with_onnxruntime",
"advanced_source/ddp_pipeline", # requires 4 gpus
"prototype_source/fx_graph_mode_ptq_dynamic",
"prototype_source/vmap_recipe",
"prototype_source/torchscript_freezing",
"prototype_source/nestedtensor",
"recipes_source/recipes/saving_and_loading_models_for_inference",
"recipes_source/recipes/saving_multiple_models_in_one_file",
"recipes_source/recipes/loading_data_recipe",
"recipes_source/recipes/tensorboard_with_pytorch",
"recipes_source/recipes/what_is_state_dict",
"recipes_source/recipes/profiler_recipe",
"recipes_source/recipes/save_load_across_devices",
"recipes_source/recipes/warmstarting_model_using_parameters_from_a_different_model",
"recipes_source/recipes/dynamic_quantization",
"recipes_source/recipes/saving_and_loading_a_general_checkpoint",
"recipes_source/recipes/benchmark",
"recipes_source/recipes/tuning_guide",
"recipes_source/recipes/zeroing_out_gradients",
"recipes_source/recipes/defining_a_neural_network",
"recipes_source/recipes/timer_quick_start",
"recipes_source/recipes/amp_recipe",
"recipes_source/recipes/Captum_Recipe",
"intermediate_source/flask_rest_api_tutorial",
"intermediate_source/text_to_speech_with_torchaudio",
"intermediate_source/tensorboard_profiler_tutorial" # reenable after 2.0 release.
]


def tutorial_source_dirs() -> List[Path]:
return [
p.relative_to(REPO_ROOT).with_name(p.stem[:-7])
Expand All @@ -68,6 +66,7 @@ def main() -> None:
glob_path = f"{tutorial_source_dir}/**/*.html"
html_file_paths += docs_dir.glob(glob_path)

should_not_run = [f'{x.replace("_source", "")}.html' for x in NOT_RUN]
did_not_run = []
for html_file_path in html_file_paths:
with open(html_file_path, "r", encoding="utf-8") as html_file:
Expand All @@ -78,9 +77,7 @@ def main() -> None:
if (
"Total running time of the script: ( 0 minutes 0.000 seconds)"
in elem.text
and not any(
html_file_path.match(file) for file in NOT_RUN
)
and not any(html_file_path.match(file) for file in should_not_run)
):
did_not_run.append(html_file_path.as_posix())

Expand Down
2 changes: 1 addition & 1 deletion .github/ISSUE_TEMPLATE/1_TRANSLATE_REQUEST.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,4 +15,4 @@ _(๋ฐ˜๋“œ์‹œ ์ง€ํ‚ค์…”์•ผ ํ•˜๋Š” ์ผ์ •์ด ์•„๋‹™๋‹ˆ๋‹ค - ์ผ์ •์ด ๋„ˆ๋ฌด ๋Šฆ์–ด
## ๊ด€๋ จ ์ด์Šˆ
_ํ˜„์žฌ ๋ฒˆ์—ญ ์š”์ฒญ / ์ง„ํ–‰ ๋‚ด์—ญ์„ ๋ณด๊ธฐ ์œ„ํ•ด ๊ฐ ๋ฒ„์ „์˜ ๋ฉ”์ธ ์ด์Šˆ๋ฅผ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค._ <br />
_(ํŠน๋ณ„ํ•œ ์ผ์ด ์—†๋‹ค๋ฉด ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์œผ์…”๋„ ๋ฉ๋‹ˆ๋‹ค.)_
* ๊ด€๋ จ ์ด์Šˆ: #615 (v1.13)
* ๊ด€๋ จ ์ด์Šˆ: #660 (v2.0)
2 changes: 1 addition & 1 deletion LICENSE
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
BSD 3-Clause License

Copyright (c) 2017, Pytorch contributors
Copyright (c) 2017, PyTorch contributors
All rights reserved.

Redistribution and use in source and binary forms, with or without
Expand Down
8 changes: 4 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
# PyTorch ํ•œ๊ตญ์–ด ํŠœํ† ๋ฆฌ์–ผ
# ํŒŒ์ดํ† ์น˜ ํ•œ๊ตญ์–ด ํŠœํ† ๋ฆฌ์–ผ (PyTorch tutorials in Korean)

## ์†Œ๊ฐœ

PyTorch์—์„œ ์ œ๊ณตํ•˜๋Š” ํŠœํ† ๋ฆฌ์–ผ์˜ ํ•œ๊ตญ์–ด ๋ฒˆ์—ญ์„ ์œ„ํ•œ ์ €์žฅ์†Œ์ž…๋‹ˆ๋‹ค.\
๋ฒˆ์—ญ์˜ ๊ฒฐ๊ณผ๋ฌผ์€ [https://tutorials.pytorch.kr](https://tutorials.pytorch.kr)์—์„œ ํ™•์ธํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (๋ฒˆ์—ญ์„ ์ง„ํ–‰ํ•˜๋ฉฐ **๋น„์ •๊ธฐ์ ์œผ๋กœ** ๋ฐ˜์˜ํ•ฉ๋‹ˆ๋‹ค.)\
ํ˜„์žฌ ๋ฒ„์ „์˜ ๋ฒˆ์—ญ / ๋ณ€๊ฒฝ ๊ด€๋ จ ์ด์Šˆ๋Š” [#615 ์ด์Šˆ](https://github.com/PyTorchKorea/tutorials-kr/issues/615)๋ฅผ ์ฐธ๊ณ ํ•ด์ฃผ์„ธ์š”.
ํ˜„์žฌ ๋ฒ„์ „์˜ ๋ฒˆ์—ญ / ๋ณ€๊ฒฝ ๊ด€๋ จ ์ด์Šˆ๋Š” [#660 ์ด์Šˆ](https://github.com/PyTorchKorea/tutorials-kr/issues/660)๋ฅผ ์ฐธ๊ณ ํ•ด์ฃผ์„ธ์š”.

## ๊ธฐ์—ฌํ•˜๊ธฐ

Expand All @@ -22,7 +22,7 @@ PyTorch์—์„œ ์ œ๊ณตํ•˜๋Š” ํŠœํ† ๋ฆฌ์–ผ์˜ ํ•œ๊ตญ์–ด ๋ฒˆ์—ญ์„ ์œ„ํ•œ ์ €์žฅ์†Œ

## ์›๋ฌธ

ํ˜„์žฌ PyTorch v1.13 ํŠœํ† ๋ฆฌ์–ผ([pytorch/tutorials@db34a77](https://github.com/pytorch/tutorials/commit/db34a779242f1a71346db4a9e5d6ac962a8d9b77) ๊ธฐ์ค€) ๋ฒˆ์—ญ์ด ์ง„ํ–‰ ์ค‘์ž…๋‹ˆ๋‹ค.
ํ˜„์žฌ PyTorch v2.0 ํŠœํ† ๋ฆฌ์–ผ([pytorch/tutorials@9efe789b](https://github.com/pytorch/tutorials/commit/9efe789bfc3763ec359b60f12b5e6dda4e6d5db0) ๊ธฐ์ค€) ๋ฒˆ์—ญ์ด ์ง„ํ–‰ ์ค‘์ž…๋‹ˆ๋‹ค.

์ตœ์‹  ๋ฒ„์ „์˜ ํŠœํ† ๋ฆฌ์–ผ(๊ณต์‹, ์˜์–ด)์€ [PyTorch tutorials ์‚ฌ์ดํŠธ](https://pytorch.org/tutorials) ๋ฐ [PyTorch tutorials ์ €์žฅ์†Œ](https://github.com/pytorch/tutorials)๋ฅผ ์ฐธ๊ณ ํ•ด์ฃผ์„ธ์š”.

Expand All @@ -46,5 +46,5 @@ v1.0 ์ดํ›„ ๋ฒˆ์—ญ์€ ๋ณ„๋„ ์ €์žฅ์†Œ๋กœ ๊ด€๋ฆฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. [์ด ์ €์žฅ
๋นŒ๋“œ ๋ฐฉ๋ฒ•์€ [๊ธฐ์—ฌํ•˜๊ธฐ ๋ฌธ์„œ์˜ `2-5. (๋‚ด ์ปดํ“จํ„ฐ์—์„œ) ๊ฒฐ๊ณผ ํ™•์ธํ•˜๊ธฐ`](https://github.com/PyTorchKorea/tutorials-kr/blob/master/CONTRIBUTING.md#2-5-๋‚ด-์ปดํ“จํ„ฐ์—์„œ-๊ฒฐ๊ณผ-ํ™•์ธํ•˜๊ธฐ) ๋ถ€๋ถ„์„ ์ฐธ๊ณ ํ•ด์ฃผ์„ธ์š”.

---
This is a project to translate [pytorch/tutorials@db34a77](https://github.com/pytorch/tutorials/commit/db34a779242f1a71346db4a9e5d6ac962a8d9b77) into Korean.
This is a project to translate [pytorch/tutorials@9efe789b](https://github.com/pytorch/tutorials/commit/9efe789bfc3763ec359b60f12b5e6dda4e6d5db0) into Korean.
For the latest version, please visit to the [official PyTorch tutorials repo](https://github.com/pytorch/tutorials).
Binary file added _static/img/invpendulum.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
1 change: 1 addition & 0 deletions _static/img/reinforcement_learning_diagram.drawio
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
<mxfile host="app.diagrams.net" modified="2022-10-01T16:00:40.980Z" agent="5.0 (X11)" etag="_qbqVrrm3wUvm_i0-Q9T" version="20.4.0" type="device"><diagram id="aSXDm0BvLjt-Za0vl2Tv" name="Page-1">5Vpbc+MmFP41nmkfmpGEpMiPjTftzrTZZtbbbbYvHSxhiRQJFeHb/vqChG4gx95ElqfTeCaGwwEO37lwDskMLNL9zwzmyQONEJk5VrSfgXczx7GtuSW+JOVQUXzXrggxw5FiaglL/BXVMxV1gyNU9Bg5pYTjvE8MaZahkPdokDG667OtKenvmsMYGYRlCIlJ/QNHPKmogWe19PcIx0m9s22pkRTWzIpQJDCiuw4J3M/AglHKq1a6XyAiwatxqeb9dGS0EYyhjJ8z4flQfCient3PwfKXVfTn40P6/vMPapUtJBt14I8oJ/AgaA8opeygZOeHGhBGN1mE5JrWDNztEszRMoehHN0JExC0hKdE9GzRXGNCFpRQVs4Fa09+BD1mMMJC7s7YqvyIsYIz+jfqjPjljxhRsiLG0f4oCHYDrbBJRFPE5SEsNcGt1aPMMVDdXatbu1ZY0tGrr2hQmVPcrNwiLhoK9G9QgGMo4Lec41T6gWN9535v4C/WFLaPTmM/AlrebR8t2z0TruBScAEDLgaziKaCtoI8TAy4wg3bltYqIUFZ9KOMCaIbElgUOOxD1rftai0UGQFCg0/sRzcsRKfdjEMWI37KGkx1dOD2BtCuaQwRyPG2L+6QCtQOjxSLgxz1DRdoWqyOqWZ1I42+kNdfCOjmUOFgLCR0U0aemi2XDMVxgQ3ztK0X5fJtjR/0+EWjkqA1z0YHr7dYz7DYR0pwKM/5AfFRw2sEUbAOh8PrLYI+sgbDaxig1foy4dWxrh1fAzOACodeqi5lPKExzSC5b6laGGh5fqU0V8g/I84PKluBG06HQu8okcN/W+Q4OyS8CWTfsPFPlbz/Cxu/eg5hm0nEmPcg2mP+JNs3nup96Yy823c7h/HvTu8/cXfqV9H8lXen5xxJuUa+O91A2yd4+e709LvTP8Hvvsh/mbvWNtPDUR0hE+I9NVNF50vrFrLb+kLZq52hcaCO+9hTuY9zpvt413Qf3Vqc29e6z1xbyJkm9TSKb51fS4mdKVJP2zXc4fc8grwsLb3rlpaODog3cItaU96ijUdNmirWscHuXq03jjdVeLDnZ8aHI+qcJsGspewFdp8Iee8ivJU7Ehxn5YD/z0a+qN0RtOZtT7Ri9Q1Tac3ZqsjLvvWJQZzhLBbNUmtqXSFnuXQzb5zd7Bvxa5FQWkgvbB4vJDxCgXVlCEOOaXZhURwpylJQiRQFZdsL7wfkfh9RSFkkGql6XrQ2KiRddG9X7t2+rF10L6/ElUpu5VZ/ZWUt1D/piuk76/K8pWyq5S+lHiVi23oGaA9E7PlAxG4Yxw/ZZr4X1q5Vu9AE6V8wP5UAyt4jYlgcG7HrlUhVGL1WkgeO5EDf/r5oDdcuo9dIeqUPXk7ygK/xn3iPNACxJkgKHTMpHNVJBmod6+Z2snzmqmWMrlCgVx/nWjjQLc+7jIUDvYw5ZeFA43emsFjzCf0iYd2ava6q7z2LTVbX18XdyaDvX9UjNIMBevl2tkdo71VATyrG8ghd4LcV6qLb/oW/Ym//TwLc/ws=</diagram></mxfile>
Binary file modified _static/img/reinforcement_learning_diagram.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
4 changes: 2 additions & 2 deletions _templates/layout.html
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@
url="https://docs.microsoft.com/learn/modules/intro-machine-learning-pytorch/8-inference?WT.mc_id=aiml-7486-cxa";
}

$(".pytorch-call-to-action-links").children().first().before("<a href="+url+' data-behavior="call-to-action-event" data-response="Run in Microsoft Learn" target="_blank"><div id="microsoft-learn-link" style="padding-bottom: 0.625rem;border-bottom: 1px solid #f3f4f7;padding-right: 2.5rem;display: -webkit-box; display: -ms-flexbox; isplay: flex; -webkit-box-align: center;-ms-flex-align: center;align-items: center;"><img class="call-to-action-img" src="../../_static/images/microsoft-logo.svg"/><div class="call-to-action-desktop-view">Run in Microsoft Learn</div><div class="call-to-action-mobile-view">Learn</div></div></a>')
$(".pytorch-call-to-action-links").children().first().before("<a href="+url+' data-behavior="call-to-action-event" data-response="Run in Microsoft Learn" target="_blank"><div id="microsoft-learn-link" style="padding-bottom: 0.625rem;border-bottom: 1px solid #f3f4f7;padding-right: 2.5rem;display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-align: center;-ms-flex-align: center;align-items: center;"><img class="call-to-action-img" src="../../_static/images/microsoft-logo.svg"/><div class="call-to-action-desktop-view">Run in Microsoft Learn</div><div class="call-to-action-mobile-view">Learn</div></div></a>')
}
</script>

Expand Down Expand Up @@ -91,7 +91,7 @@
</script>

<script type="text/javascript">
var collapsedSections = ['ํŒŒ์ดํ† ์น˜(PyTorch) ๋ ˆ์‹œํ”ผ', 'ํŒŒ์ดํ† ์น˜(PyTorch) ๋ฐฐ์šฐ๊ธฐ', '์ด๋ฏธ์ง€/๋น„๋””์˜ค', '์˜ค๋””์˜ค', 'ํ…์ŠคํŠธ', '๊ฐ•ํ™”ํ•™์Šต', 'PyTorch ๋ชจ๋ธ์„ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์— ๋ฐฐํฌํ•˜๊ธฐ', 'Code Transforms with FX', 'ํ”„๋ก ํŠธ์—”๋“œ API', 'PyTorch ํ™•์žฅํ•˜๊ธฐ', '๋ชจ๋ธ ์ตœ์ ํ™”', '๋ณ‘๋ ฌ ๋ฐ ๋ถ„์‚ฐ ํ•™์Šต', 'Mobile', 'Introduction to PyTorch on YouTube', 'Recommendation Systems'];
var collapsedSections = ['ํŒŒ์ดํ† ์น˜(PyTorch) ๋ ˆ์‹œํ”ผ', 'ํŒŒ์ดํ† ์น˜(PyTorch) ๋ฐฐ์šฐ๊ธฐ', '์ด๋ฏธ์ง€/๋น„๋””์˜ค', '์˜ค๋””์˜ค', 'ํ…์ŠคํŠธ', '๊ฐ•ํ™”ํ•™์Šต', 'PyTorch ๋ชจ๋ธ์„ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์— ๋ฐฐํฌํ•˜๊ธฐ', 'Code Transforms with FX', 'ํ”„๋ก ํŠธ์—”๋“œ API', 'PyTorch ํ™•์žฅํ•˜๊ธฐ', '๋ชจ๋ธ ์ตœ์ ํ™”', '๋ณ‘๋ ฌ ๋ฐ ๋ถ„์‚ฐ ํ•™์Šต', '๋ชจ๋ฐ”์ผ', 'Introduction to PyTorch on YouTube', '์ถ”์ฒœ ์‹œ์Šคํ…œ', 'Multimodality'];
</script>

{% endblock %}
Loading

0 comments on commit 92b69bc

Please sign in to comment.