diff --git a/books/zh/book.toml b/books/zh/book.toml deleted file mode 100644 index e7a3089..0000000 --- a/books/zh/book.toml +++ /dev/null @@ -1,19 +0,0 @@ -[book] -authors = ["OpenMLSys Contributors"] -language = "zh-CN" -src = "../../zh_chapters" -title = "机器学习系统:设计和实现" - -[build] -build-dir = "../../.mdbook-zh/book" -create-missing = false - -[preprocessor.openmlsys-zh] -command = "python3 ../../tools/mdbook_zh_preprocessor.py" - -[output.html] -mathjax-support = true -git-repository-url = "https://github.com/openmlsys/openmlsys-zh" -preferred-dark-theme = "navy" -additional-css = ["theme/dark-mode-images.css", "theme/version-selector.css"] -additional-js = ["theme/version-selector.js"] diff --git a/books/zh/theme/dark-mode-images.css b/books/zh/theme/dark-mode-images.css deleted file mode 100644 index c5805c1..0000000 --- a/books/zh/theme/dark-mode-images.css +++ /dev/null @@ -1,16 +0,0 @@ -/* 暗色模式下仅为正文图片添加浅灰色背景,提高透明背景图片的可读性 */ -.navy .content main img, -.coal .content main img, -.ayu .content main img { - background-color: #e8e8e8; - border-radius: 4px; - padding: 8px; -} - -/* 首页 frontpage 图片保持透明,不添加正文图像底色。 */ -.navy .openmlsys-frontpage img, -.coal .openmlsys-frontpage img, -.ayu .openmlsys-frontpage img { - background-color: transparent !important; - padding: 0 !important; -} diff --git a/books/zh/theme/typst.css b/books/zh/theme/typst.css deleted file mode 100644 index 1929751..0000000 --- a/books/zh/theme/typst.css +++ /dev/null @@ -1,16 +0,0 @@ -.typst-inline { - display: inline-flex; - vertical-align: -0.2em; -} - -.typst-display { - display: flex; - justify-content: center; - margin: 1rem 0; - overflow-x: auto; -} - -.typst-doc { - color: var(--fg); - max-width: 100%; -} diff --git a/conftest.py b/conftest.py new file mode 100644 index 0000000..4b03990 --- /dev/null +++ b/conftest.py @@ -0,0 +1,4 @@ +import sys +from pathlib import Path + +sys.path.insert(0, str(Path(__file__).resolve().parent)) diff --git a/en_chapters/SUMMARY.md b/en_chapters/SUMMARY.md deleted file mode 100644 index 9436c5d..0000000 --- a/en_chapters/SUMMARY.md +++ /dev/null @@ -1,3 +0,0 @@ -# Summary - -[Machine Learning Systems: Design and Implementation](index.md) diff --git a/en_chapters/appendix_machine_learning_introduction/classic_machine_learning.md b/en_chapters/appendix_machine_learning_introduction/classic_machine_learning.md deleted file mode 100644 index 2086545..0000000 --- a/en_chapters/appendix_machine_learning_introduction/classic_machine_learning.md +++ /dev/null @@ -1 +0,0 @@ -[TODO: src = zh_chapters/appendix_machine_learning_introduction/classic_machine_learning.md] diff --git a/en_chapters/appendix_machine_learning_introduction/gradient_descent.md b/en_chapters/appendix_machine_learning_introduction/gradient_descent.md deleted file mode 100644 index d642e9c..0000000 --- a/en_chapters/appendix_machine_learning_introduction/gradient_descent.md +++ /dev/null @@ -1 +0,0 @@ -[TODO: src = zh_chapters/appendix_machine_learning_introduction/gradient_descent.md] diff --git a/en_chapters/appendix_machine_learning_introduction/index.md b/en_chapters/appendix_machine_learning_introduction/index.md deleted file mode 100644 index 8b1eaa2..0000000 --- a/en_chapters/appendix_machine_learning_introduction/index.md +++ /dev/null @@ -1 +0,0 @@ -[TODO: src = zh_chapters/appendix_machine_learning_introduction/index.md] diff --git a/en_chapters/appendix_machine_learning_introduction/neural_network.md b/en_chapters/appendix_machine_learning_introduction/neural_network.md deleted file mode 100644 index f248fc9..0000000 --- a/en_chapters/appendix_machine_learning_introduction/neural_network.md +++ /dev/null @@ -1 +0,0 @@ -[TODO: src = zh_chapters/appendix_machine_learning_introduction/neural_network.md] diff --git a/en_chapters/chapter_accelerator/accelerator_architecture.md b/en_chapters/chapter_accelerator/accelerator_architecture.md deleted file mode 100644 index 5805e4d..0000000 --- a/en_chapters/chapter_accelerator/accelerator_architecture.md +++ /dev/null @@ -1 +0,0 @@ -[TODO: src = zh_chapters/chapter_accelerator/accelerator_architecture.md] diff --git a/en_chapters/chapter_accelerator/accelerator_introduction.md b/en_chapters/chapter_accelerator/accelerator_introduction.md deleted file mode 100644 index 44b0a73..0000000 --- a/en_chapters/chapter_accelerator/accelerator_introduction.md +++ /dev/null @@ -1 +0,0 @@ -[TODO: src = zh_chapters/chapter_accelerator/accelerator_introduction.md] diff --git a/en_chapters/chapter_accelerator/accelerator_practise.md b/en_chapters/chapter_accelerator/accelerator_practise.md deleted file mode 100644 index a18225b..0000000 --- a/en_chapters/chapter_accelerator/accelerator_practise.md +++ /dev/null @@ -1 +0,0 @@ -[TODO: src = zh_chapters/chapter_accelerator/accelerator_practise.md] diff --git a/en_chapters/chapter_accelerator/accelerator_programming.md b/en_chapters/chapter_accelerator/accelerator_programming.md deleted file mode 100644 index d3eed66..0000000 --- a/en_chapters/chapter_accelerator/accelerator_programming.md +++ /dev/null @@ -1 +0,0 @@ -[TODO: src = zh_chapters/chapter_accelerator/accelerator_programming.md] diff --git a/en_chapters/chapter_accelerator/index.md b/en_chapters/chapter_accelerator/index.md deleted file mode 100644 index aa6d859..0000000 --- a/en_chapters/chapter_accelerator/index.md +++ /dev/null @@ -1 +0,0 @@ -[TODO: src = zh_chapters/chapter_accelerator/index.md] diff --git a/en_chapters/chapter_accelerator/summary.md b/en_chapters/chapter_accelerator/summary.md deleted file mode 100644 index 12fb41a..0000000 --- a/en_chapters/chapter_accelerator/summary.md +++ /dev/null @@ -1 +0,0 @@ -[TODO: src = zh_chapters/chapter_accelerator/summary.md] diff --git a/en_chapters/chapter_backend_and_runtime/compute_schedule_and_execute.md b/en_chapters/chapter_backend_and_runtime/compute_schedule_and_execute.md deleted file mode 100644 index 627d9b8..0000000 --- a/en_chapters/chapter_backend_and_runtime/compute_schedule_and_execute.md +++ /dev/null @@ -1 +0,0 @@ -[TODO: src = zh_chapters/chapter_backend_and_runtime/compute_schedule_and_execute.md] diff --git a/en_chapters/chapter_backend_and_runtime/graph_optimizer.md b/en_chapters/chapter_backend_and_runtime/graph_optimizer.md deleted file mode 100644 index 139673f..0000000 --- a/en_chapters/chapter_backend_and_runtime/graph_optimizer.md +++ /dev/null @@ -1 +0,0 @@ -[TODO: src = zh_chapters/chapter_backend_and_runtime/graph_optimizer.md] diff --git a/en_chapters/chapter_backend_and_runtime/index.md b/en_chapters/chapter_backend_and_runtime/index.md deleted file mode 100644 index aeca214..0000000 --- a/en_chapters/chapter_backend_and_runtime/index.md +++ /dev/null @@ -1 +0,0 @@ -[TODO: src = zh_chapters/chapter_backend_and_runtime/index.md] diff --git a/en_chapters/chapter_backend_and_runtime/kernel_selecter.md b/en_chapters/chapter_backend_and_runtime/kernel_selecter.md deleted file mode 100644 index 9e1f32c..0000000 --- a/en_chapters/chapter_backend_and_runtime/kernel_selecter.md +++ /dev/null @@ -1 +0,0 @@ -[TODO: src = zh_chapters/chapter_backend_and_runtime/kernel_selecter.md] diff --git a/en_chapters/chapter_backend_and_runtime/memory_allocator.md b/en_chapters/chapter_backend_and_runtime/memory_allocator.md deleted file mode 100644 index 73479d1..0000000 --- a/en_chapters/chapter_backend_and_runtime/memory_allocator.md +++ /dev/null @@ -1 +0,0 @@ -[TODO: src = zh_chapters/chapter_backend_and_runtime/memory_allocator.md] diff --git a/en_chapters/chapter_backend_and_runtime/op_compiler.md b/en_chapters/chapter_backend_and_runtime/op_compiler.md deleted file mode 100644 index 95dd3be..0000000 --- a/en_chapters/chapter_backend_and_runtime/op_compiler.md +++ /dev/null @@ -1 +0,0 @@ -[TODO: src = zh_chapters/chapter_backend_and_runtime/op_compiler.md] diff --git a/en_chapters/chapter_backend_and_runtime/overview.md b/en_chapters/chapter_backend_and_runtime/overview.md deleted file mode 100644 index 3c2539e..0000000 --- a/en_chapters/chapter_backend_and_runtime/overview.md +++ /dev/null @@ -1 +0,0 @@ -[TODO: src = zh_chapters/chapter_backend_and_runtime/overview.md] diff --git a/en_chapters/chapter_backend_and_runtime/summary.md b/en_chapters/chapter_backend_and_runtime/summary.md deleted file mode 100644 index 11383e4..0000000 --- a/en_chapters/chapter_backend_and_runtime/summary.md +++ /dev/null @@ -1 +0,0 @@ -[TODO: src = zh_chapters/chapter_backend_and_runtime/summary.md] diff --git a/en_chapters/chapter_computational_graph/background_and_functionality.md b/en_chapters/chapter_computational_graph/background_and_functionality.md deleted file mode 100644 index 669f0c6..0000000 --- a/en_chapters/chapter_computational_graph/background_and_functionality.md +++ /dev/null @@ -1 +0,0 @@ -[TODO: src = zh_chapters/chapter_computational_graph/background_and_functionality.md] diff --git a/en_chapters/chapter_computational_graph/components_of_computational_graph.md b/en_chapters/chapter_computational_graph/components_of_computational_graph.md deleted file mode 100644 index 90aaa2a..0000000 --- a/en_chapters/chapter_computational_graph/components_of_computational_graph.md +++ /dev/null @@ -1 +0,0 @@ -[TODO: src = zh_chapters/chapter_computational_graph/components_of_computational_graph.md] diff --git a/en_chapters/chapter_computational_graph/generation_of_computational_graph.md b/en_chapters/chapter_computational_graph/generation_of_computational_graph.md deleted file mode 100644 index 24ef339..0000000 --- a/en_chapters/chapter_computational_graph/generation_of_computational_graph.md +++ /dev/null @@ -1 +0,0 @@ -[TODO: src = zh_chapters/chapter_computational_graph/generation_of_computational_graph.md] diff --git a/en_chapters/chapter_computational_graph/index.md b/en_chapters/chapter_computational_graph/index.md deleted file mode 100644 index 910fe59..0000000 --- a/en_chapters/chapter_computational_graph/index.md +++ /dev/null @@ -1 +0,0 @@ -[TODO: src = zh_chapters/chapter_computational_graph/index.md] diff --git a/en_chapters/chapter_computational_graph/schedule_of_computational_graph.md b/en_chapters/chapter_computational_graph/schedule_of_computational_graph.md deleted file mode 100644 index 86f68ce..0000000 --- a/en_chapters/chapter_computational_graph/schedule_of_computational_graph.md +++ /dev/null @@ -1 +0,0 @@ -[TODO: src = zh_chapters/chapter_computational_graph/schedule_of_computational_graph.md] diff --git a/en_chapters/chapter_computational_graph/summary.md b/en_chapters/chapter_computational_graph/summary.md deleted file mode 100644 index 3ed7400..0000000 --- a/en_chapters/chapter_computational_graph/summary.md +++ /dev/null @@ -1 +0,0 @@ -[TODO: src = zh_chapters/chapter_computational_graph/summary.md] diff --git a/en_chapters/chapter_data_processing/data_order.md b/en_chapters/chapter_data_processing/data_order.md deleted file mode 100644 index c202234..0000000 --- a/en_chapters/chapter_data_processing/data_order.md +++ /dev/null @@ -1 +0,0 @@ -[TODO: src = zh_chapters/chapter_data_processing/data_order.md] diff --git a/en_chapters/chapter_data_processing/extension.md b/en_chapters/chapter_data_processing/extension.md deleted file mode 100644 index 29f19a5..0000000 --- a/en_chapters/chapter_data_processing/extension.md +++ /dev/null @@ -1 +0,0 @@ -[TODO: src = zh_chapters/chapter_data_processing/extension.md] diff --git a/en_chapters/chapter_data_processing/index.md b/en_chapters/chapter_data_processing/index.md deleted file mode 100644 index 3af1318..0000000 --- a/en_chapters/chapter_data_processing/index.md +++ /dev/null @@ -1 +0,0 @@ -[TODO: src = zh_chapters/chapter_data_processing/index.md] diff --git a/en_chapters/chapter_data_processing/performance.md b/en_chapters/chapter_data_processing/performance.md deleted file mode 100644 index 75c7193..0000000 --- a/en_chapters/chapter_data_processing/performance.md +++ /dev/null @@ -1 +0,0 @@ -[TODO: src = zh_chapters/chapter_data_processing/performance.md] diff --git a/en_chapters/chapter_data_processing/program_model.md b/en_chapters/chapter_data_processing/program_model.md deleted file mode 100644 index 0e4f5b7..0000000 --- a/en_chapters/chapter_data_processing/program_model.md +++ /dev/null @@ -1 +0,0 @@ -[TODO: src = zh_chapters/chapter_data_processing/program_model.md] diff --git a/en_chapters/chapter_data_processing/requirements.md b/en_chapters/chapter_data_processing/requirements.md deleted file mode 100644 index 7085c33..0000000 --- a/en_chapters/chapter_data_processing/requirements.md +++ /dev/null @@ -1 +0,0 @@ -[TODO: src = zh_chapters/chapter_data_processing/requirements.md] diff --git a/en_chapters/chapter_data_processing/summary.md b/en_chapters/chapter_data_processing/summary.md deleted file mode 100644 index 3836106..0000000 --- a/en_chapters/chapter_data_processing/summary.md +++ /dev/null @@ -1 +0,0 @@ -[TODO: src = zh_chapters/chapter_data_processing/summary.md] diff --git a/en_chapters/chapter_distributed_training/cluster.md b/en_chapters/chapter_distributed_training/cluster.md deleted file mode 100644 index cb74a6a..0000000 --- a/en_chapters/chapter_distributed_training/cluster.md +++ /dev/null @@ -1 +0,0 @@ -[TODO: src = zh_chapters/chapter_distributed_training/cluster.md] diff --git a/en_chapters/chapter_distributed_training/collective.md b/en_chapters/chapter_distributed_training/collective.md deleted file mode 100644 index 1b51153..0000000 --- a/en_chapters/chapter_distributed_training/collective.md +++ /dev/null @@ -1 +0,0 @@ -[TODO: src = zh_chapters/chapter_distributed_training/collective.md] diff --git a/en_chapters/chapter_distributed_training/index.md b/en_chapters/chapter_distributed_training/index.md deleted file mode 100644 index c71a92a..0000000 --- a/en_chapters/chapter_distributed_training/index.md +++ /dev/null @@ -1 +0,0 @@ -[TODO: src = zh_chapters/chapter_distributed_training/index.md] diff --git a/en_chapters/chapter_distributed_training/methods.md b/en_chapters/chapter_distributed_training/methods.md deleted file mode 100644 index 0c704ec..0000000 --- a/en_chapters/chapter_distributed_training/methods.md +++ /dev/null @@ -1 +0,0 @@ -[TODO: src = zh_chapters/chapter_distributed_training/methods.md] diff --git a/en_chapters/chapter_distributed_training/overview.md b/en_chapters/chapter_distributed_training/overview.md deleted file mode 100644 index 2f76c7e..0000000 --- a/en_chapters/chapter_distributed_training/overview.md +++ /dev/null @@ -1 +0,0 @@ -[TODO: src = zh_chapters/chapter_distributed_training/overview.md] diff --git a/en_chapters/chapter_distributed_training/parameter_servers.md b/en_chapters/chapter_distributed_training/parameter_servers.md deleted file mode 100644 index 72f23e2..0000000 --- a/en_chapters/chapter_distributed_training/parameter_servers.md +++ /dev/null @@ -1 +0,0 @@ -[TODO: src = zh_chapters/chapter_distributed_training/parameter_servers.md] diff --git a/en_chapters/chapter_distributed_training/summary.md b/en_chapters/chapter_distributed_training/summary.md deleted file mode 100644 index 662eb3b..0000000 --- a/en_chapters/chapter_distributed_training/summary.md +++ /dev/null @@ -1 +0,0 @@ -[TODO: src = zh_chapters/chapter_distributed_training/summary.md] diff --git a/en_chapters/chapter_explainable_AI/explainable_ai.md b/en_chapters/chapter_explainable_AI/explainable_ai.md deleted file mode 100644 index 3fa9fba..0000000 --- a/en_chapters/chapter_explainable_AI/explainable_ai.md +++ /dev/null @@ -1 +0,0 @@ -[TODO: src = zh_chapters/chapter_explainable_AI/explainable_ai.md] diff --git a/en_chapters/chapter_explainable_AI/index.md b/en_chapters/chapter_explainable_AI/index.md deleted file mode 100644 index 86c298c..0000000 --- a/en_chapters/chapter_explainable_AI/index.md +++ /dev/null @@ -1 +0,0 @@ -[TODO: src = zh_chapters/chapter_explainable_AI/index.md] diff --git a/en_chapters/chapter_federated_learning/horizontal_fl.md b/en_chapters/chapter_federated_learning/horizontal_fl.md deleted file mode 100644 index 21fc87e..0000000 --- a/en_chapters/chapter_federated_learning/horizontal_fl.md +++ /dev/null @@ -1 +0,0 @@ -[TODO: src = zh_chapters/chapter_federated_learning/horizontal_fl.md] diff --git a/en_chapters/chapter_federated_learning/index.md b/en_chapters/chapter_federated_learning/index.md deleted file mode 100644 index f059db0..0000000 --- a/en_chapters/chapter_federated_learning/index.md +++ /dev/null @@ -1 +0,0 @@ -[TODO: src = zh_chapters/chapter_federated_learning/index.md] diff --git a/en_chapters/chapter_federated_learning/outlook.md b/en_chapters/chapter_federated_learning/outlook.md deleted file mode 100644 index 474e227..0000000 --- a/en_chapters/chapter_federated_learning/outlook.md +++ /dev/null @@ -1 +0,0 @@ -[TODO: src = zh_chapters/chapter_federated_learning/outlook.md] diff --git a/en_chapters/chapter_federated_learning/overview.md b/en_chapters/chapter_federated_learning/overview.md deleted file mode 100644 index b401351..0000000 --- a/en_chapters/chapter_federated_learning/overview.md +++ /dev/null @@ -1 +0,0 @@ -[TODO: src = zh_chapters/chapter_federated_learning/overview.md] diff --git a/en_chapters/chapter_federated_learning/privacy_encryption_algorithm.md b/en_chapters/chapter_federated_learning/privacy_encryption_algorithm.md deleted file mode 100644 index a5f36bc..0000000 --- a/en_chapters/chapter_federated_learning/privacy_encryption_algorithm.md +++ /dev/null @@ -1 +0,0 @@ -[TODO: src = zh_chapters/chapter_federated_learning/privacy_encryption_algorithm.md] diff --git a/en_chapters/chapter_federated_learning/summary.md b/en_chapters/chapter_federated_learning/summary.md deleted file mode 100644 index a6231d9..0000000 --- a/en_chapters/chapter_federated_learning/summary.md +++ /dev/null @@ -1 +0,0 @@ -[TODO: src = zh_chapters/chapter_federated_learning/summary.md] diff --git a/en_chapters/chapter_federated_learning/vertical_fl.md b/en_chapters/chapter_federated_learning/vertical_fl.md deleted file mode 100644 index 46124ef..0000000 --- a/en_chapters/chapter_federated_learning/vertical_fl.md +++ /dev/null @@ -1 +0,0 @@ -[TODO: src = zh_chapters/chapter_federated_learning/vertical_fl.md] diff --git a/en_chapters/chapter_frontend_and_ir/ad.md b/en_chapters/chapter_frontend_and_ir/ad.md deleted file mode 100644 index 5d4d543..0000000 --- a/en_chapters/chapter_frontend_and_ir/ad.md +++ /dev/null @@ -1 +0,0 @@ -[TODO: src = zh_chapters/chapter_frontend_and_ir/ad.md] diff --git a/en_chapters/chapter_frontend_and_ir/ai_compiler_design_principle.md b/en_chapters/chapter_frontend_and_ir/ai_compiler_design_principle.md deleted file mode 100644 index c57a470..0000000 --- a/en_chapters/chapter_frontend_and_ir/ai_compiler_design_principle.md +++ /dev/null @@ -1 +0,0 @@ -[TODO: src = zh_chapters/chapter_frontend_and_ir/ai_compiler_design_principle.md] diff --git a/en_chapters/chapter_frontend_and_ir/common_frontend_optimization_pass.md b/en_chapters/chapter_frontend_and_ir/common_frontend_optimization_pass.md deleted file mode 100644 index 4e35b87..0000000 --- a/en_chapters/chapter_frontend_and_ir/common_frontend_optimization_pass.md +++ /dev/null @@ -1 +0,0 @@ -[TODO: src = zh_chapters/chapter_frontend_and_ir/common_frontend_optimization_pass.md] diff --git a/en_chapters/chapter_frontend_and_ir/index.md b/en_chapters/chapter_frontend_and_ir/index.md deleted file mode 100644 index fa859b7..0000000 --- a/en_chapters/chapter_frontend_and_ir/index.md +++ /dev/null @@ -1 +0,0 @@ -[TODO: src = zh_chapters/chapter_frontend_and_ir/index.md] diff --git a/en_chapters/chapter_frontend_and_ir/intermediate_representation.md b/en_chapters/chapter_frontend_and_ir/intermediate_representation.md deleted file mode 100644 index 5f013d0..0000000 --- a/en_chapters/chapter_frontend_and_ir/intermediate_representation.md +++ /dev/null @@ -1 +0,0 @@ -[TODO: src = zh_chapters/chapter_frontend_and_ir/intermediate_representation.md] diff --git a/en_chapters/chapter_frontend_and_ir/overview_of_frontend.md b/en_chapters/chapter_frontend_and_ir/overview_of_frontend.md deleted file mode 100644 index 7a77be1..0000000 --- a/en_chapters/chapter_frontend_and_ir/overview_of_frontend.md +++ /dev/null @@ -1 +0,0 @@ -[TODO: src = zh_chapters/chapter_frontend_and_ir/overview_of_frontend.md] diff --git a/en_chapters/chapter_frontend_and_ir/summary.md b/en_chapters/chapter_frontend_and_ir/summary.md deleted file mode 100644 index f5afa7b..0000000 --- a/en_chapters/chapter_frontend_and_ir/summary.md +++ /dev/null @@ -1 +0,0 @@ -[TODO: src = zh_chapters/chapter_frontend_and_ir/summary.md] diff --git a/en_chapters/chapter_frontend_and_ir/type_system_and_static_analysis.md b/en_chapters/chapter_frontend_and_ir/type_system_and_static_analysis.md deleted file mode 100644 index e3aed85..0000000 --- a/en_chapters/chapter_frontend_and_ir/type_system_and_static_analysis.md +++ /dev/null @@ -1 +0,0 @@ -[TODO: src = zh_chapters/chapter_frontend_and_ir/type_system_and_static_analysis.md] diff --git a/en_chapters/chapter_introduction/applications.md b/en_chapters/chapter_introduction/applications.md deleted file mode 100644 index 56382e3..0000000 --- a/en_chapters/chapter_introduction/applications.md +++ /dev/null @@ -1 +0,0 @@ -[TODO: src = zh_chapters/chapter_introduction/applications.md] diff --git a/en_chapters/chapter_introduction/architecture.md b/en_chapters/chapter_introduction/architecture.md deleted file mode 100644 index ccc2e96..0000000 --- a/en_chapters/chapter_introduction/architecture.md +++ /dev/null @@ -1 +0,0 @@ -[TODO: src = zh_chapters/chapter_introduction/architecture.md] diff --git a/en_chapters/chapter_introduction/design.md b/en_chapters/chapter_introduction/design.md deleted file mode 100644 index 9f8575d..0000000 --- a/en_chapters/chapter_introduction/design.md +++ /dev/null @@ -1 +0,0 @@ -[TODO: src = zh_chapters/chapter_introduction/design.md] diff --git a/en_chapters/chapter_introduction/ecosystem.md b/en_chapters/chapter_introduction/ecosystem.md deleted file mode 100644 index 0580fba..0000000 --- a/en_chapters/chapter_introduction/ecosystem.md +++ /dev/null @@ -1 +0,0 @@ -[TODO: src = zh_chapters/chapter_introduction/ecosystem.md] diff --git a/en_chapters/chapter_introduction/index.md b/en_chapters/chapter_introduction/index.md deleted file mode 100644 index 554fdd7..0000000 --- a/en_chapters/chapter_introduction/index.md +++ /dev/null @@ -1 +0,0 @@ -[TODO: src = zh_chapters/chapter_introduction/index.md] diff --git a/en_chapters/chapter_introduction/readers.md b/en_chapters/chapter_introduction/readers.md deleted file mode 100644 index a49bb6e..0000000 --- a/en_chapters/chapter_introduction/readers.md +++ /dev/null @@ -1 +0,0 @@ -[TODO: src = zh_chapters/chapter_introduction/readers.md] diff --git a/en_chapters/chapter_model_deployment/index.md b/en_chapters/chapter_model_deployment/index.md deleted file mode 100644 index 03bd0b1..0000000 --- a/en_chapters/chapter_model_deployment/index.md +++ /dev/null @@ -1 +0,0 @@ -[TODO: src = zh_chapters/chapter_model_deployment/index.md] diff --git a/en_chapters/chapter_model_deployment/model_compression.md b/en_chapters/chapter_model_deployment/model_compression.md deleted file mode 100644 index a6f7d82..0000000 --- a/en_chapters/chapter_model_deployment/model_compression.md +++ /dev/null @@ -1 +0,0 @@ -[TODO: src = zh_chapters/chapter_model_deployment/model_compression.md] diff --git a/en_chapters/chapter_model_deployment/model_converter_and_optimizer.md b/en_chapters/chapter_model_deployment/model_converter_and_optimizer.md deleted file mode 100644 index 7d29e75..0000000 --- a/en_chapters/chapter_model_deployment/model_converter_and_optimizer.md +++ /dev/null @@ -1 +0,0 @@ -[TODO: src = zh_chapters/chapter_model_deployment/model_converter_and_optimizer.md] diff --git a/en_chapters/chapter_model_deployment/model_deployment_introduction.md b/en_chapters/chapter_model_deployment/model_deployment_introduction.md deleted file mode 100644 index 3c63a17..0000000 --- a/en_chapters/chapter_model_deployment/model_deployment_introduction.md +++ /dev/null @@ -1 +0,0 @@ -[TODO: src = zh_chapters/chapter_model_deployment/model_deployment_introduction.md] diff --git a/en_chapters/chapter_model_deployment/model_inference.md b/en_chapters/chapter_model_deployment/model_inference.md deleted file mode 100644 index 2070a80..0000000 --- a/en_chapters/chapter_model_deployment/model_inference.md +++ /dev/null @@ -1 +0,0 @@ -[TODO: src = zh_chapters/chapter_model_deployment/model_inference.md] diff --git a/en_chapters/chapter_model_deployment/model_security.md b/en_chapters/chapter_model_deployment/model_security.md deleted file mode 100644 index b8c6277..0000000 --- a/en_chapters/chapter_model_deployment/model_security.md +++ /dev/null @@ -1 +0,0 @@ -[TODO: src = zh_chapters/chapter_model_deployment/model_security.md] diff --git a/en_chapters/chapter_model_deployment/summary.md b/en_chapters/chapter_model_deployment/summary.md deleted file mode 100644 index 13e4935..0000000 --- a/en_chapters/chapter_model_deployment/summary.md +++ /dev/null @@ -1 +0,0 @@ -[TODO: src = zh_chapters/chapter_model_deployment/summary.md] diff --git a/en_chapters/chapter_preface/index.md b/en_chapters/chapter_preface/index.md deleted file mode 100644 index 4bc0a55..0000000 --- a/en_chapters/chapter_preface/index.md +++ /dev/null @@ -1 +0,0 @@ -[TODO: src = zh_chapters/chapter_preface/index.md] diff --git a/en_chapters/chapter_preface_advanced/index.md b/en_chapters/chapter_preface_advanced/index.md deleted file mode 100644 index 1329884..0000000 --- a/en_chapters/chapter_preface_advanced/index.md +++ /dev/null @@ -1 +0,0 @@ -[TODO: src = zh_chapters/chapter_preface_advanced/index.md] diff --git a/en_chapters/chapter_preface_extension/index.md b/en_chapters/chapter_preface_extension/index.md deleted file mode 100644 index 084f4fb..0000000 --- a/en_chapters/chapter_preface_extension/index.md +++ /dev/null @@ -1 +0,0 @@ -[TODO: src = zh_chapters/chapter_preface_extension/index.md] diff --git a/en_chapters/chapter_programming_interface/c_python_interaction.md b/en_chapters/chapter_programming_interface/c_python_interaction.md deleted file mode 100644 index 5a9b9b1..0000000 --- a/en_chapters/chapter_programming_interface/c_python_interaction.md +++ /dev/null @@ -1 +0,0 @@ -[TODO: src = zh_chapters/chapter_programming_interface/c_python_interaction.md] diff --git a/en_chapters/chapter_programming_interface/development_history.md b/en_chapters/chapter_programming_interface/development_history.md deleted file mode 100644 index 9bb7490..0000000 --- a/en_chapters/chapter_programming_interface/development_history.md +++ /dev/null @@ -1 +0,0 @@ -[TODO: src = zh_chapters/chapter_programming_interface/development_history.md] diff --git a/en_chapters/chapter_programming_interface/index.md b/en_chapters/chapter_programming_interface/index.md deleted file mode 100644 index 80eea58..0000000 --- a/en_chapters/chapter_programming_interface/index.md +++ /dev/null @@ -1 +0,0 @@ -[TODO: src = zh_chapters/chapter_programming_interface/index.md] diff --git a/en_chapters/chapter_programming_interface/ml_programming_paradigm.md b/en_chapters/chapter_programming_interface/ml_programming_paradigm.md deleted file mode 100644 index 36e9b84..0000000 --- a/en_chapters/chapter_programming_interface/ml_programming_paradigm.md +++ /dev/null @@ -1 +0,0 @@ -[TODO: src = zh_chapters/chapter_programming_interface/ml_programming_paradigm.md] diff --git a/en_chapters/chapter_programming_interface/ml_workflow.md b/en_chapters/chapter_programming_interface/ml_workflow.md deleted file mode 100644 index fc5d572..0000000 --- a/en_chapters/chapter_programming_interface/ml_workflow.md +++ /dev/null @@ -1 +0,0 @@ -[TODO: src = zh_chapters/chapter_programming_interface/ml_workflow.md] diff --git a/en_chapters/chapter_programming_interface/neural_network_layer.md b/en_chapters/chapter_programming_interface/neural_network_layer.md deleted file mode 100644 index 1c5a55e..0000000 --- a/en_chapters/chapter_programming_interface/neural_network_layer.md +++ /dev/null @@ -1 +0,0 @@ -[TODO: src = zh_chapters/chapter_programming_interface/neural_network_layer.md] diff --git a/en_chapters/chapter_programming_interface/summary.md b/en_chapters/chapter_programming_interface/summary.md deleted file mode 100644 index 23643fe..0000000 --- a/en_chapters/chapter_programming_interface/summary.md +++ /dev/null @@ -1 +0,0 @@ -[TODO: src = zh_chapters/chapter_programming_interface/summary.md] diff --git a/en_chapters/chapter_recommender_system/case_study.md b/en_chapters/chapter_recommender_system/case_study.md deleted file mode 100644 index e1ff369..0000000 --- a/en_chapters/chapter_recommender_system/case_study.md +++ /dev/null @@ -1 +0,0 @@ -[TODO: src = zh_chapters/chapter_recommender_system/case_study.md] diff --git a/en_chapters/chapter_recommender_system/index.md b/en_chapters/chapter_recommender_system/index.md deleted file mode 100644 index c89b484..0000000 --- a/en_chapters/chapter_recommender_system/index.md +++ /dev/null @@ -1 +0,0 @@ -[TODO: src = zh_chapters/chapter_recommender_system/index.md] diff --git a/en_chapters/chapter_recommender_system/model_update.md b/en_chapters/chapter_recommender_system/model_update.md deleted file mode 100644 index 77eb824..0000000 --- a/en_chapters/chapter_recommender_system/model_update.md +++ /dev/null @@ -1 +0,0 @@ -[TODO: src = zh_chapters/chapter_recommender_system/model_update.md] diff --git a/en_chapters/chapter_recommender_system/multi_stage_recommender_system.md b/en_chapters/chapter_recommender_system/multi_stage_recommender_system.md deleted file mode 100644 index 17a8561..0000000 --- a/en_chapters/chapter_recommender_system/multi_stage_recommender_system.md +++ /dev/null @@ -1 +0,0 @@ -[TODO: src = zh_chapters/chapter_recommender_system/multi_stage_recommender_system.md] diff --git a/en_chapters/chapter_recommender_system/summary.md b/en_chapters/chapter_recommender_system/summary.md deleted file mode 100644 index 48a6aa7..0000000 --- a/en_chapters/chapter_recommender_system/summary.md +++ /dev/null @@ -1 +0,0 @@ -[TODO: src = zh_chapters/chapter_recommender_system/summary.md] diff --git a/en_chapters/chapter_recommender_system/system_architecture.md b/en_chapters/chapter_recommender_system/system_architecture.md deleted file mode 100644 index 7303366..0000000 --- a/en_chapters/chapter_recommender_system/system_architecture.md +++ /dev/null @@ -1 +0,0 @@ -[TODO: src = zh_chapters/chapter_recommender_system/system_architecture.md] diff --git a/en_chapters/chapter_reinforcement_learning/index.md b/en_chapters/chapter_reinforcement_learning/index.md deleted file mode 100644 index 878ef04..0000000 --- a/en_chapters/chapter_reinforcement_learning/index.md +++ /dev/null @@ -1 +0,0 @@ -[TODO: src = zh_chapters/chapter_reinforcement_learning/index.md] diff --git a/en_chapters/chapter_reinforcement_learning/marl.md b/en_chapters/chapter_reinforcement_learning/marl.md deleted file mode 100644 index 2e2d97f..0000000 --- a/en_chapters/chapter_reinforcement_learning/marl.md +++ /dev/null @@ -1 +0,0 @@ -[TODO: src = zh_chapters/chapter_reinforcement_learning/marl.md] diff --git a/en_chapters/chapter_reinforcement_learning/marl_sys.md b/en_chapters/chapter_reinforcement_learning/marl_sys.md deleted file mode 100644 index 067f422..0000000 --- a/en_chapters/chapter_reinforcement_learning/marl_sys.md +++ /dev/null @@ -1 +0,0 @@ -[TODO: src = zh_chapters/chapter_reinforcement_learning/marl_sys.md] diff --git a/en_chapters/chapter_reinforcement_learning/rl_introduction.md b/en_chapters/chapter_reinforcement_learning/rl_introduction.md deleted file mode 100644 index fccaed6..0000000 --- a/en_chapters/chapter_reinforcement_learning/rl_introduction.md +++ /dev/null @@ -1 +0,0 @@ -[TODO: src = zh_chapters/chapter_reinforcement_learning/rl_introduction.md] diff --git a/en_chapters/chapter_reinforcement_learning/single_node_rl.md b/en_chapters/chapter_reinforcement_learning/single_node_rl.md deleted file mode 100644 index 80648ff..0000000 --- a/en_chapters/chapter_reinforcement_learning/single_node_rl.md +++ /dev/null @@ -1 +0,0 @@ -[TODO: src = zh_chapters/chapter_reinforcement_learning/single_node_rl.md] diff --git a/en_chapters/chapter_reinforcement_learning/summary.md b/en_chapters/chapter_reinforcement_learning/summary.md deleted file mode 100644 index 03373f9..0000000 --- a/en_chapters/chapter_reinforcement_learning/summary.md +++ /dev/null @@ -1 +0,0 @@ -[TODO: src = zh_chapters/chapter_reinforcement_learning/summary.md] diff --git a/en_chapters/chapter_rl_sys/control.md b/en_chapters/chapter_rl_sys/control.md deleted file mode 100644 index f172c22..0000000 --- a/en_chapters/chapter_rl_sys/control.md +++ /dev/null @@ -1 +0,0 @@ -[TODO: src = zh_chapters/chapter_rl_sys/control.md] diff --git a/en_chapters/chapter_rl_sys/control_code_ex.md b/en_chapters/chapter_rl_sys/control_code_ex.md deleted file mode 100644 index 1f9d80c..0000000 --- a/en_chapters/chapter_rl_sys/control_code_ex.md +++ /dev/null @@ -1 +0,0 @@ -[TODO: src = zh_chapters/chapter_rl_sys/control_code_ex.md] diff --git a/en_chapters/chapter_rl_sys/index.md b/en_chapters/chapter_rl_sys/index.md deleted file mode 100644 index e5e7aad..0000000 --- a/en_chapters/chapter_rl_sys/index.md +++ /dev/null @@ -1 +0,0 @@ -[TODO: src = zh_chapters/chapter_rl_sys/index.md] diff --git a/en_chapters/chapter_rl_sys/perception.md b/en_chapters/chapter_rl_sys/perception.md deleted file mode 100644 index f820531..0000000 --- a/en_chapters/chapter_rl_sys/perception.md +++ /dev/null @@ -1 +0,0 @@ -[TODO: src = zh_chapters/chapter_rl_sys/perception.md] diff --git a/en_chapters/chapter_rl_sys/perception_code_ex.md b/en_chapters/chapter_rl_sys/perception_code_ex.md deleted file mode 100644 index 9656c9f..0000000 --- a/en_chapters/chapter_rl_sys/perception_code_ex.md +++ /dev/null @@ -1 +0,0 @@ -[TODO: src = zh_chapters/chapter_rl_sys/perception_code_ex.md] diff --git a/en_chapters/chapter_rl_sys/planning.md b/en_chapters/chapter_rl_sys/planning.md deleted file mode 100644 index 8004124..0000000 --- a/en_chapters/chapter_rl_sys/planning.md +++ /dev/null @@ -1 +0,0 @@ -[TODO: src = zh_chapters/chapter_rl_sys/planning.md] diff --git a/en_chapters/chapter_rl_sys/planning_code_ex.md b/en_chapters/chapter_rl_sys/planning_code_ex.md deleted file mode 100644 index a2fe6ac..0000000 --- a/en_chapters/chapter_rl_sys/planning_code_ex.md +++ /dev/null @@ -1 +0,0 @@ -[TODO: src = zh_chapters/chapter_rl_sys/planning_code_ex.md] diff --git a/en_chapters/chapter_rl_sys/rl_sys_intro.md b/en_chapters/chapter_rl_sys/rl_sys_intro.md deleted file mode 100644 index 90b1f5b..0000000 --- a/en_chapters/chapter_rl_sys/rl_sys_intro.md +++ /dev/null @@ -1 +0,0 @@ -[TODO: src = zh_chapters/chapter_rl_sys/rl_sys_intro.md] diff --git a/en_chapters/chapter_rl_sys/robot_learning.md b/en_chapters/chapter_rl_sys/robot_learning.md deleted file mode 100644 index 62f7980..0000000 --- a/en_chapters/chapter_rl_sys/robot_learning.md +++ /dev/null @@ -1 +0,0 @@ -[TODO: src = zh_chapters/chapter_rl_sys/robot_learning.md] diff --git a/en_chapters/chapter_rl_sys/robot_safety.md b/en_chapters/chapter_rl_sys/robot_safety.md deleted file mode 100644 index 08065dc..0000000 --- a/en_chapters/chapter_rl_sys/robot_safety.md +++ /dev/null @@ -1 +0,0 @@ -[TODO: src = zh_chapters/chapter_rl_sys/robot_safety.md] diff --git a/en_chapters/chapter_rl_sys/ros.md b/en_chapters/chapter_rl_sys/ros.md deleted file mode 100644 index cb5c9d5..0000000 --- a/en_chapters/chapter_rl_sys/ros.md +++ /dev/null @@ -1 +0,0 @@ -[TODO: src = zh_chapters/chapter_rl_sys/ros.md] diff --git a/en_chapters/chapter_rl_sys/ros_code_ex.md b/en_chapters/chapter_rl_sys/ros_code_ex.md deleted file mode 100644 index 0ddec7a..0000000 --- a/en_chapters/chapter_rl_sys/ros_code_ex.md +++ /dev/null @@ -1 +0,0 @@ -[TODO: src = zh_chapters/chapter_rl_sys/ros_code_ex.md] diff --git a/en_chapters/chapter_rl_sys/summary.md b/en_chapters/chapter_rl_sys/summary.md deleted file mode 100644 index 5b26b41..0000000 --- a/en_chapters/chapter_rl_sys/summary.md +++ /dev/null @@ -1 +0,0 @@ -[TODO: src = zh_chapters/chapter_rl_sys/summary.md] diff --git a/en_chapters/config.ini b/en_chapters/config.ini deleted file mode 100644 index de5ecae..0000000 --- a/en_chapters/config.ini +++ /dev/null @@ -1,90 +0,0 @@ -[project] - -name = machine laerning system - -title = 机器学习系统:设计和实现 - -author = Luo Mai, Hao Dong - -copyright = 2022, All authors. - -release = 1.0.0 - -lang = zh - -[build] - -# A list of wildcards to indicate the markdown files that need to be evaluated as -# Jupyter notebooks. -notebooks = *.md */*.md - -# A list of files that will be copied to the build folder. -resources = img/ references/ - -# Files that will be skipped. -exclusions = */*_origin.md README.md README_EN.md info/* contrib/*md zh_chapters/*/* - -# If True (default), then will evaluate the notebook to obtain outputs. -eval_notebook = True - -tabs = mindspore, pytorch, tensorflow - -sphinx_configs = numfig_format = {'figure': '图%%s', 'table': '表%%s', 'code-block': '列表%%s', 'section': '%%s节'} - latex_elements = { - 'utf8extra' : '', - 'inputenc' : '', - 'babel' : r'''\usepackage[english]{babel}''', - 'preamble' : r''' - \usepackage{ctex} - \setmainfont{Source Serif Pro} - \setsansfont{Source Sans Pro} - \setmonofont{Source Code Pro} - \setCJKmainfont[BoldFont=Source Han Serif SC SemiBold]{Source Han Serif SC} - \setCJKsansfont[BoldFont=Source Han Sans SC Medium]{Source Han Sans SC Normal} - \setCJKmonofont{Source Han Sans SC Normal} - \addto\captionsenglish{\renewcommand{\chaptername}{}} - \addto\captionsenglish{\renewcommand{\contentsname}{目录}} - \usepackage[draft]{minted} - \fvset{breaklines=true, breakanywhere=true} - \setlength{\headheight}{13.6pt} - \makeatletter - \fancypagestyle{normal}{ - \fancyhf{} - \fancyfoot[LE,RO]{{\py@HeaderFamily\thepage}} - \fancyfoot[LO]{{\py@HeaderFamily\nouppercase{\rightmark}}} - \fancyfoot[RE]{{\py@HeaderFamily\nouppercase{\leftmark}}} - \fancyhead[LE,RO]{{\py@HeaderFamily }} - } - \makeatother - \CJKsetecglue{} - \usepackage{zhnumber} - ''', - # The font size ('10pt', '11pt' or '12pt'). - 'pointsize': '10pt', - # Latex figure (float) alignment - 'figure_align': 'H', - 'fncychap': '\\usepackage[Sonny]{fncychap}', - } - bibtex_bibfiles = ['references/accelerator.bib', 'references/appendix.bib', 'references/backend.bib', 'references/data.bib', 'references/explainable.bib', 'references/extension.bib', 'references/federated.bib', 'references/frontend.bib', 'references/graph.bib', 'references/interface.bib', 'references/introduction.bib', 'references/model.bib', 'references/model_deployment.bib', 'references/recommender.bib', 'references/reinforcement.bib', 'references/rlsys.bib', 'references/training.bib'] - - - -[html] - -# A list of links that is displayed on the navbar. A link consists of three -# items: name, URL, and a fontawesome icon -# (https://fontawesome.com/icons?d=gallery). Items are separated by commas. -header_links = GitHub, https://github.com/openmlsys/openmlsys-zh, fab fa-github, - 中文, https://openmlsys.github.io/cn/, fas fa-language - -favicon = static/favicon.png - -html_logo = static/logo-with-text.png - - -[pdf] - -# The file used to post-process the generated tex file. -# post_latex = ./static/post_latex/main.py - -latex_logo = static/logo.png diff --git a/en_chapters/frontpage.html b/en_chapters/frontpage.html deleted file mode 100644 index a18cd7f..0000000 --- a/en_chapters/frontpage.html +++ /dev/null @@ -1,507 +0,0 @@ -
- - - -
- The first open-source book to comprehensively cover machine learning systems
- - -' - f'{label}' - "
" - ) + return "" def wrap_frontpage_html( diff --git a/img/Advanced/preface3_1.png b/v1/img/Advanced/preface3_1.png similarity index 100% rename from img/Advanced/preface3_1.png rename to v1/img/Advanced/preface3_1.png diff --git a/img/Advanced/preface3_2.png b/v1/img/Advanced/preface3_2.png similarity index 100% rename from img/Advanced/preface3_2.png rename to v1/img/Advanced/preface3_2.png diff --git a/img/Advanced/preface3_3.png b/v1/img/Advanced/preface3_3.png similarity index 100% rename from img/Advanced/preface3_3.png rename to v1/img/Advanced/preface3_3.png diff --git a/img/Advanced/preface3_4.png b/v1/img/Advanced/preface3_4.png similarity index 100% rename from img/Advanced/preface3_4.png rename to v1/img/Advanced/preface3_4.png diff --git a/img/Advanced/preface3_5.png b/v1/img/Advanced/preface3_5.png similarity index 100% rename from img/Advanced/preface3_5.png rename to v1/img/Advanced/preface3_5.png diff --git a/img/Advanced/preface3_arc.png b/v1/img/Advanced/preface3_arc.png similarity index 100% rename from img/Advanced/preface3_arc.png rename to v1/img/Advanced/preface3_arc.png diff --git a/img/ch01/framework-architecture.png b/v1/img/ch01/framework-architecture.png similarity index 100% rename from img/ch01/framework-architecture.png rename to v1/img/ch01/framework-architecture.png diff --git a/img/ch01/system-ecosystem.png b/v1/img/ch01/system-ecosystem.png similarity index 100% rename from img/ch01/system-ecosystem.png rename to v1/img/ch01/system-ecosystem.png diff --git a/img/ch02/cell_abstract.svg b/v1/img/ch02/cell_abstract.svg similarity index 100% rename from img/ch02/cell_abstract.svg rename to v1/img/ch02/cell_abstract.svg diff --git a/img/ch02/channels_conv.svg b/v1/img/ch02/channels_conv.svg similarity index 100% rename from img/ch02/channels_conv.svg rename to v1/img/ch02/channels_conv.svg diff --git a/img/ch02/conv_component.svg b/v1/img/ch02/conv_component.svg similarity index 100% rename from img/ch02/conv_component.svg rename to v1/img/ch02/conv_component.svg diff --git a/img/ch02/fc_layer_1.svg b/v1/img/ch02/fc_layer_1.svg similarity index 100% rename from img/ch02/fc_layer_1.svg rename to v1/img/ch02/fc_layer_1.svg diff --git a/img/ch02/framework_development_history.svg b/v1/img/ch02/framework_development_history.svg similarity index 100% rename from img/ch02/framework_development_history.svg rename to v1/img/ch02/framework_development_history.svg diff --git a/img/ch02/img_workflow.svg b/v1/img/ch02/img_workflow.svg similarity index 100% rename from img/ch02/img_workflow.svg rename to v1/img/ch02/img_workflow.svg diff --git a/img/ch02/model_build.svg b/v1/img/ch02/model_build.svg similarity index 100% rename from img/ch02/model_build.svg rename to v1/img/ch02/model_build.svg diff --git a/img/ch02/nn_network.svg b/v1/img/ch02/nn_network.svg similarity index 100% rename from img/ch02/nn_network.svg rename to v1/img/ch02/nn_network.svg diff --git a/img/ch02/pooling.svg b/v1/img/ch02/pooling.svg similarity index 100% rename from img/ch02/pooling.svg rename to v1/img/ch02/pooling.svg diff --git a/img/ch02/single_channel_conv.svg b/v1/img/ch02/single_channel_conv.svg similarity index 100% rename from img/ch02/single_channel_conv.svg rename to v1/img/ch02/single_channel_conv.svg diff --git a/img/ch03/ast.svg b/v1/img/ch03/ast.svg similarity index 100% rename from img/ch03/ast.svg rename to v1/img/ch03/ast.svg diff --git a/img/ch03/ast1.svg b/v1/img/ch03/ast1.svg similarity index 100% rename from img/ch03/ast1.svg rename to v1/img/ch03/ast1.svg diff --git a/img/ch03/asyn_para.svg b/v1/img/ch03/asyn_para.svg similarity index 100% rename from img/ch03/asyn_para.svg rename to v1/img/ch03/asyn_para.svg diff --git a/img/ch03/asynchronous.svg b/v1/img/ch03/asynchronous.svg similarity index 100% rename from img/ch03/asynchronous.svg rename to v1/img/ch03/asynchronous.svg diff --git a/img/ch03/chain.png b/v1/img/ch03/chain.png similarity index 100% rename from img/ch03/chain.png rename to v1/img/ch03/chain.png diff --git a/img/ch03/chain.svg b/v1/img/ch03/chain.svg similarity index 100% rename from img/ch03/chain.svg rename to v1/img/ch03/chain.svg diff --git a/img/ch03/dag.svg b/v1/img/ch03/dag.svg similarity index 100% rename from img/ch03/dag.svg rename to v1/img/ch03/dag.svg diff --git a/img/ch03/dependence.svg b/v1/img/ch03/dependence.svg similarity index 100% rename from img/ch03/dependence.svg rename to v1/img/ch03/dependence.svg diff --git a/img/ch03/dynamic-gen.svg b/v1/img/ch03/dynamic-gen.svg similarity index 100% rename from img/ch03/dynamic-gen.svg rename to v1/img/ch03/dynamic-gen.svg diff --git a/img/ch03/dynamic-gen1.svg b/v1/img/ch03/dynamic-gen1.svg similarity index 100% rename from img/ch03/dynamic-gen1.svg rename to v1/img/ch03/dynamic-gen1.svg diff --git a/img/ch03/dynamic.svg b/v1/img/ch03/dynamic.svg similarity index 100% rename from img/ch03/dynamic.svg rename to v1/img/ch03/dynamic.svg diff --git a/img/ch03/dynamic1.svg b/v1/img/ch03/dynamic1.svg similarity index 100% rename from img/ch03/dynamic1.svg rename to v1/img/ch03/dynamic1.svg diff --git a/img/ch03/dynamic_gen.png b/v1/img/ch03/dynamic_gen.png similarity index 100% rename from img/ch03/dynamic_gen.png rename to v1/img/ch03/dynamic_gen.png diff --git a/img/ch03/eager-gen.png b/v1/img/ch03/eager-gen.png similarity index 100% rename from img/ch03/eager-gen.png rename to v1/img/ch03/eager-gen.png diff --git a/img/ch03/eager.png b/v1/img/ch03/eager.png similarity index 100% rename from img/ch03/eager.png rename to v1/img/ch03/eager.png diff --git a/img/ch03/graph.png b/v1/img/ch03/graph.png similarity index 100% rename from img/ch03/graph.png rename to v1/img/ch03/graph.png diff --git a/img/ch03/if.png b/v1/img/ch03/if.png similarity index 100% rename from img/ch03/if.png rename to v1/img/ch03/if.png diff --git a/img/ch03/if.svg b/v1/img/ch03/if.svg similarity index 100% rename from img/ch03/if.svg rename to v1/img/ch03/if.svg diff --git a/img/ch03/order.png b/v1/img/ch03/order.png similarity index 100% rename from img/ch03/order.png rename to v1/img/ch03/order.png diff --git a/img/ch03/order.svg b/v1/img/ch03/order.svg similarity index 100% rename from img/ch03/order.svg rename to v1/img/ch03/order.svg diff --git a/img/ch03/para.svg b/v1/img/ch03/para.svg similarity index 100% rename from img/ch03/para.svg rename to v1/img/ch03/para.svg diff --git a/img/ch03/recurrent.png b/v1/img/ch03/recurrent.png similarity index 100% rename from img/ch03/recurrent.png rename to v1/img/ch03/recurrent.png diff --git a/img/ch03/recurrent.svg b/v1/img/ch03/recurrent.svg similarity index 100% rename from img/ch03/recurrent.svg rename to v1/img/ch03/recurrent.svg diff --git a/img/ch03/schedule.svg b/v1/img/ch03/schedule.svg similarity index 100% rename from img/ch03/schedule.svg rename to v1/img/ch03/schedule.svg diff --git a/img/ch03/simpledag.png b/v1/img/ch03/simpledag.png similarity index 100% rename from img/ch03/simpledag.png rename to v1/img/ch03/simpledag.png diff --git a/img/ch03/simpledag.svg b/v1/img/ch03/simpledag.svg similarity index 100% rename from img/ch03/simpledag.svg rename to v1/img/ch03/simpledag.svg diff --git a/img/ch03/static-gen.svg b/v1/img/ch03/static-gen.svg similarity index 100% rename from img/ch03/static-gen.svg rename to v1/img/ch03/static-gen.svg diff --git a/img/ch03/static.png b/v1/img/ch03/static.png similarity index 100% rename from img/ch03/static.png rename to v1/img/ch03/static.png diff --git a/img/ch03/static.svg b/v1/img/ch03/static.svg similarity index 100% rename from img/ch03/static.svg rename to v1/img/ch03/static.svg diff --git a/img/ch03/static1.svg b/v1/img/ch03/static1.svg similarity index 100% rename from img/ch03/static1.svg rename to v1/img/ch03/static1.svg diff --git a/img/ch03/static_gen.png b/v1/img/ch03/static_gen.png similarity index 100% rename from img/ch03/static_gen.png rename to v1/img/ch03/static_gen.png diff --git a/img/ch03/synchronization.svg b/v1/img/ch03/synchronization.svg similarity index 100% rename from img/ch03/synchronization.svg rename to v1/img/ch03/synchronization.svg diff --git a/img/ch03/tensor.png b/v1/img/ch03/tensor.png similarity index 100% rename from img/ch03/tensor.png rename to v1/img/ch03/tensor.png diff --git a/img/ch03/tensor.svg b/v1/img/ch03/tensor.svg similarity index 100% rename from img/ch03/tensor.svg rename to v1/img/ch03/tensor.svg diff --git a/img/ch03/tensorclass.svg b/v1/img/ch03/tensorclass.svg similarity index 100% rename from img/ch03/tensorclass.svg rename to v1/img/ch03/tensorclass.svg diff --git a/img/ch03/unroll.png b/v1/img/ch03/unroll.png similarity index 100% rename from img/ch03/unroll.png rename to v1/img/ch03/unroll.png diff --git a/img/ch03/unroll.svg b/v1/img/ch03/unroll.svg similarity index 100% rename from img/ch03/unroll.svg rename to v1/img/ch03/unroll.svg diff --git a/img/ch03/while.png b/v1/img/ch03/while.png similarity index 100% rename from img/ch03/while.png rename to v1/img/ch03/while.png diff --git a/img/ch03/while.svg b/v1/img/ch03/while.svg similarity index 100% rename from img/ch03/while.svg rename to v1/img/ch03/while.svg diff --git a/img/ch04/LLVM基础结构.png b/v1/img/ch04/LLVM基础结构.png similarity index 100% rename from img/ch04/LLVM基础结构.png rename to v1/img/ch04/LLVM基础结构.png diff --git a/img/ch04/TensorFlow-IR.png b/v1/img/ch04/TensorFlow-IR.png similarity index 100% rename from img/ch04/TensorFlow-IR.png rename to v1/img/ch04/TensorFlow-IR.png diff --git a/img/ch04/中间表示-ASTDAG.svg b/v1/img/ch04/中间表示-ASTDAG.svg similarity index 100% rename from img/ch04/中间表示-ASTDAG.svg rename to v1/img/ch04/中间表示-ASTDAG.svg diff --git a/img/ch04/中间表示-Jaxpr.png b/v1/img/ch04/中间表示-Jaxpr.png similarity index 100% rename from img/ch04/中间表示-Jaxpr.png rename to v1/img/ch04/中间表示-Jaxpr.png diff --git a/img/ch04/中间表示-LLVMIR.png b/v1/img/ch04/中间表示-LLVMIR.png similarity index 100% rename from img/ch04/中间表示-LLVMIR.png rename to v1/img/ch04/中间表示-LLVMIR.png diff --git a/img/ch04/中间表示-MLIR.png b/v1/img/ch04/中间表示-MLIR.png similarity index 100% rename from img/ch04/中间表示-MLIR.png rename to v1/img/ch04/中间表示-MLIR.png diff --git a/img/ch04/中间表示-MindIR.png b/v1/img/ch04/中间表示-MindIR.png similarity index 100% rename from img/ch04/中间表示-MindIR.png rename to v1/img/ch04/中间表示-MindIR.png diff --git a/img/ch04/中间表示-MindIR图.png b/v1/img/ch04/中间表示-MindIR图.png similarity index 100% rename from img/ch04/中间表示-MindIR图.png rename to v1/img/ch04/中间表示-MindIR图.png diff --git a/img/ch04/中间表示-MindIR示例.png b/v1/img/ch04/中间表示-MindIR示例.png similarity index 100% rename from img/ch04/中间表示-MindIR示例.png rename to v1/img/ch04/中间表示-MindIR示例.png diff --git a/img/ch04/中间表示-torchscript.png b/v1/img/ch04/中间表示-torchscript.png similarity index 100% rename from img/ch04/中间表示-torchscript.png rename to v1/img/ch04/中间表示-torchscript.png diff --git a/img/ch04/中间表示-中间表示结构.png b/v1/img/ch04/中间表示-中间表示结构.png similarity index 100% rename from img/ch04/中间表示-中间表示结构.png rename to v1/img/ch04/中间表示-中间表示结构.png diff --git a/img/ch04/中间表示-线性中间表示.png b/v1/img/ch04/中间表示-线性中间表示.png similarity index 100% rename from img/ch04/中间表示-线性中间表示.png rename to v1/img/ch04/中间表示-线性中间表示.png diff --git a/img/ch04/符号微分的表达式膨胀问题.png b/v1/img/ch04/符号微分的表达式膨胀问题.png similarity index 100% rename from img/ch04/符号微分的表达式膨胀问题.png rename to v1/img/ch04/符号微分的表达式膨胀问题.png diff --git a/img/ch04/编译优化-pass结构.svg b/v1/img/ch04/编译优化-pass结构.svg similarity index 100% rename from img/ch04/编译优化-pass结构.svg rename to v1/img/ch04/编译优化-pass结构.svg diff --git a/img/ch04/编译优化-公共子表达式消除.svg b/v1/img/ch04/编译优化-公共子表达式消除.svg similarity index 100% rename from img/ch04/编译优化-公共子表达式消除.svg rename to v1/img/ch04/编译优化-公共子表达式消除.svg diff --git a/img/ch04/编译优化-常量传播与常量折叠.svg b/v1/img/ch04/编译优化-常量传播与常量折叠.svg similarity index 100% rename from img/ch04/编译优化-常量传播与常量折叠.svg rename to v1/img/ch04/编译优化-常量传播与常量折叠.svg diff --git a/img/ch04/编译优化-无用代码消除.svg b/v1/img/ch04/编译优化-无用代码消除.svg similarity index 100% rename from img/ch04/编译优化-无用代码消除.svg rename to v1/img/ch04/编译优化-无用代码消除.svg diff --git a/img/ch04/编译器前端基础架构.svg b/v1/img/ch04/编译器前端基础架构.svg similarity index 100% rename from img/ch04/编译器前端基础架构.svg rename to v1/img/ch04/编译器前端基础架构.svg diff --git a/img/ch04/编译器整体流程.png b/v1/img/ch04/编译器整体流程.png similarity index 100% rename from img/ch04/编译器整体流程.png rename to v1/img/ch04/编译器整体流程.png diff --git a/img/ch04/自动微分-前向模式自动微分示例.png b/v1/img/ch04/自动微分-前向模式自动微分示例.png similarity index 100% rename from img/ch04/自动微分-前向模式自动微分示例.png rename to v1/img/ch04/自动微分-前向模式自动微分示例.png diff --git a/img/ch04/自动微分-反向模式自动微分示例.png b/v1/img/ch04/自动微分-反向模式自动微分示例.png similarity index 100% rename from img/ch04/自动微分-反向模式自动微分示例.png rename to v1/img/ch04/自动微分-反向模式自动微分示例.png diff --git a/img/ch04/自动微分-示例计算图.svg b/v1/img/ch04/自动微分-示例计算图.svg similarity index 100% rename from img/ch04/自动微分-示例计算图.svg rename to v1/img/ch04/自动微分-示例计算图.svg diff --git a/img/ch04/静态分析-静态分析模块.png b/v1/img/ch04/静态分析-静态分析模块.png similarity index 100% rename from img/ch04/静态分析-静态分析模块.png rename to v1/img/ch04/静态分析-静态分析模块.png diff --git a/img/ch05/SIMD.png b/v1/img/ch05/SIMD.png similarity index 100% rename from img/ch05/SIMD.png rename to v1/img/ch05/SIMD.png diff --git a/img/ch05/SIMT.png b/v1/img/ch05/SIMT.png similarity index 100% rename from img/ch05/SIMT.png rename to v1/img/ch05/SIMT.png diff --git a/img/ch05/combine_memory_reuse_and_no_reuse.png b/v1/img/ch05/combine_memory_reuse_and_no_reuse.png similarity index 100% rename from img/ch05/combine_memory_reuse_and_no_reuse.png rename to v1/img/ch05/combine_memory_reuse_and_no_reuse.png diff --git a/img/ch05/compiler-backend-architecture.png b/v1/img/ch05/compiler-backend-architecture.png similarity index 100% rename from img/ch05/compiler-backend-architecture.png rename to v1/img/ch05/compiler-backend-architecture.png diff --git a/img/ch05/computation_graph.png b/v1/img/ch05/computation_graph.png similarity index 100% rename from img/ch05/computation_graph.png rename to v1/img/ch05/computation_graph.png diff --git a/img/ch05/concat.png b/v1/img/ch05/concat.png similarity index 100% rename from img/ch05/concat.png rename to v1/img/ch05/concat.png diff --git a/img/ch05/conv_sum_relu.png b/v1/img/ch05/conv_sum_relu.png similarity index 100% rename from img/ch05/conv_sum_relu.png rename to v1/img/ch05/conv_sum_relu.png diff --git a/img/ch05/data_format.png b/v1/img/ch05/data_format.png similarity index 100% rename from img/ch05/data_format.png rename to v1/img/ch05/data_format.png diff --git a/img/ch05/device_malloc.png b/v1/img/ch05/device_malloc.png similarity index 100% rename from img/ch05/device_malloc.png rename to v1/img/ch05/device_malloc.png diff --git a/img/ch05/floatdtype.png b/v1/img/ch05/floatdtype.png similarity index 100% rename from img/ch05/floatdtype.png rename to v1/img/ch05/floatdtype.png diff --git a/img/ch05/graph_exec.png b/v1/img/ch05/graph_exec.png similarity index 100% rename from img/ch05/graph_exec.png rename to v1/img/ch05/graph_exec.png diff --git a/img/ch05/graph_exec_1.png b/v1/img/ch05/graph_exec_1.png similarity index 100% rename from img/ch05/graph_exec_1.png rename to v1/img/ch05/graph_exec_1.png diff --git a/img/ch05/graph_exec_2.png b/v1/img/ch05/graph_exec_2.png similarity index 100% rename from img/ch05/graph_exec_2.png rename to v1/img/ch05/graph_exec_2.png diff --git a/img/ch05/graph_exec_3.png b/v1/img/ch05/graph_exec_3.png similarity index 100% rename from img/ch05/graph_exec_3.png rename to v1/img/ch05/graph_exec_3.png diff --git a/img/ch05/graph_exec_4.png b/v1/img/ch05/graph_exec_4.png similarity index 100% rename from img/ch05/graph_exec_4.png rename to v1/img/ch05/graph_exec_4.png diff --git a/img/ch05/graph_exec_5.png b/v1/img/ch05/graph_exec_5.png similarity index 100% rename from img/ch05/graph_exec_5.png rename to v1/img/ch05/graph_exec_5.png diff --git a/img/ch05/graph_exec_6.png b/v1/img/ch05/graph_exec_6.png similarity index 100% rename from img/ch05/graph_exec_6.png rename to v1/img/ch05/graph_exec_6.png diff --git a/img/ch05/graph_exec_7.png b/v1/img/ch05/graph_exec_7.png similarity index 100% rename from img/ch05/graph_exec_7.png rename to v1/img/ch05/graph_exec_7.png diff --git a/img/ch05/graph_exec_8.png b/v1/img/ch05/graph_exec_8.png similarity index 100% rename from img/ch05/graph_exec_8.png rename to v1/img/ch05/graph_exec_8.png diff --git a/img/ch05/graph_kernel.png b/v1/img/ch05/graph_kernel.png similarity index 100% rename from img/ch05/graph_kernel.png rename to v1/img/ch05/graph_kernel.png diff --git a/img/ch05/host-device-memory.png b/v1/img/ch05/host-device-memory.png similarity index 100% rename from img/ch05/host-device-memory.png rename to v1/img/ch05/host-device-memory.png diff --git a/img/ch05/inplace-op.png b/v1/img/ch05/inplace-op.png similarity index 100% rename from img/ch05/inplace-op.png rename to v1/img/ch05/inplace-op.png diff --git a/img/ch05/matmuldatalayout.png b/v1/img/ch05/matmuldatalayout.png similarity index 100% rename from img/ch05/matmuldatalayout.png rename to v1/img/ch05/matmuldatalayout.png diff --git a/img/ch05/memory_allocate.png b/v1/img/ch05/memory_allocate.png similarity index 100% rename from img/ch05/memory_allocate.png rename to v1/img/ch05/memory_allocate.png diff --git a/img/ch05/memory_architecture.png b/v1/img/ch05/memory_architecture.png similarity index 100% rename from img/ch05/memory_architecture.png rename to v1/img/ch05/memory_architecture.png diff --git a/img/ch05/memory_fusion.png b/v1/img/ch05/memory_fusion.png similarity index 100% rename from img/ch05/memory_fusion.png rename to v1/img/ch05/memory_fusion.png diff --git a/img/ch05/nchw.png b/v1/img/ch05/nchw.png similarity index 100% rename from img/ch05/nchw.png rename to v1/img/ch05/nchw.png diff --git a/img/ch05/nchwandnhwc.png b/v1/img/ch05/nchwandnhwc.png similarity index 100% rename from img/ch05/nchwandnhwc.png rename to v1/img/ch05/nchwandnhwc.png diff --git a/img/ch05/parallel_computing.png b/v1/img/ch05/parallel_computing.png similarity index 100% rename from img/ch05/parallel_computing.png rename to v1/img/ch05/parallel_computing.png diff --git a/img/ch05/poly.png b/v1/img/ch05/poly.png similarity index 100% rename from img/ch05/poly.png rename to v1/img/ch05/poly.png diff --git a/img/ch05/poly_test.png b/v1/img/ch05/poly_test.png similarity index 100% rename from img/ch05/poly_test.png rename to v1/img/ch05/poly_test.png diff --git a/img/ch05/select_kernel.png b/v1/img/ch05/select_kernel.png similarity index 100% rename from img/ch05/select_kernel.png rename to v1/img/ch05/select_kernel.png diff --git a/img/ch05/side_effect_1.png b/v1/img/ch05/side_effect_1.png similarity index 100% rename from img/ch05/side_effect_1.png rename to v1/img/ch05/side_effect_1.png diff --git a/img/ch05/side_effect_2.png b/v1/img/ch05/side_effect_2.png similarity index 100% rename from img/ch05/side_effect_2.png rename to v1/img/ch05/side_effect_2.png diff --git a/img/ch05/single_op_exec.PNG b/v1/img/ch05/single_op_exec.PNG similarity index 100% rename from img/ch05/single_op_exec.PNG rename to v1/img/ch05/single_op_exec.PNG diff --git a/img/ch05/transdata.png b/v1/img/ch05/transdata.png similarity index 100% rename from img/ch05/transdata.png rename to v1/img/ch05/transdata.png diff --git a/img/ch06/6.4/duplicated_data.png b/v1/img/ch06/6.4/duplicated_data.png similarity index 100% rename from img/ch06/6.4/duplicated_data.png rename to v1/img/ch06/6.4/duplicated_data.png diff --git a/img/ch06/6.4/hide_global_latency.png b/v1/img/ch06/6.4/hide_global_latency.png similarity index 100% rename from img/ch06/6.4/hide_global_latency.png rename to v1/img/ch06/6.4/hide_global_latency.png diff --git a/img/ch06/6.4/hide_smem_latency.png b/v1/img/ch06/6.4/hide_smem_latency.png similarity index 100% rename from img/ch06/6.4/hide_smem_latency.png rename to v1/img/ch06/6.4/hide_smem_latency.png diff --git a/img/ch06/6.4/naive.png b/v1/img/ch06/6.4/naive.png similarity index 100% rename from img/ch06/6.4/naive.png rename to v1/img/ch06/6.4/naive.png diff --git a/img/ch06/6.4/use_float4.png b/v1/img/ch06/6.4/use_float4.png similarity index 100% rename from img/ch06/6.4/use_float4.png rename to v1/img/ch06/6.4/use_float4.png diff --git a/img/ch06/6.4/use_smem_load.png b/v1/img/ch06/6.4/use_smem_load.png similarity index 100% rename from img/ch06/6.4/use_smem_load.png rename to v1/img/ch06/6.4/use_smem_load.png diff --git a/img/ch06/6.4/use_smem_pipeline.png b/v1/img/ch06/6.4/use_smem_pipeline.png similarity index 100% rename from img/ch06/6.4/use_smem_pipeline.png rename to v1/img/ch06/6.4/use_smem_pipeline.png diff --git a/img/ch06/6.4/use_smem_store.png b/v1/img/ch06/6.4/use_smem_store.png similarity index 100% rename from img/ch06/6.4/use_smem_store.png rename to v1/img/ch06/6.4/use_smem_store.png diff --git a/img/ch06/6.4/use_tile.png b/v1/img/ch06/6.4/use_tile.png similarity index 100% rename from img/ch06/6.4/use_tile.png rename to v1/img/ch06/6.4/use_tile.png diff --git a/img/ch06/G2S.svg b/v1/img/ch06/G2S.svg similarity index 100% rename from img/ch06/G2S.svg rename to v1/img/ch06/G2S.svg diff --git a/img/ch06/MLIR-Lowing.svg b/v1/img/ch06/MLIR-Lowing.svg similarity index 100% rename from img/ch06/MLIR-Lowing.svg rename to v1/img/ch06/MLIR-Lowing.svg diff --git a/img/ch06/MLIR-Lowing_cn.png b/v1/img/ch06/MLIR-Lowing_cn.png similarity index 100% rename from img/ch06/MLIR-Lowing_cn.png rename to v1/img/ch06/MLIR-Lowing_cn.png diff --git a/img/ch06/R2TC.svg b/v1/img/ch06/R2TC.svg similarity index 100% rename from img/ch06/R2TC.svg rename to v1/img/ch06/R2TC.svg diff --git a/img/ch06/S2R.svg b/v1/img/ch06/S2R.svg similarity index 100% rename from img/ch06/S2R.svg rename to v1/img/ch06/S2R.svg diff --git a/img/ch06/SM.svg b/v1/img/ch06/SM.svg similarity index 100% rename from img/ch06/SM.svg rename to v1/img/ch06/SM.svg diff --git a/img/ch06/SM_cn.png b/v1/img/ch06/SM_cn.png similarity index 100% rename from img/ch06/SM_cn.png rename to v1/img/ch06/SM_cn.png diff --git a/img/ch06/TBE.svg b/v1/img/ch06/TBE.svg similarity index 100% rename from img/ch06/TBE.svg rename to v1/img/ch06/TBE.svg diff --git a/img/ch06/TBE_cn.png b/v1/img/ch06/TBE_cn.png similarity index 100% rename from img/ch06/TBE_cn.png rename to v1/img/ch06/TBE_cn.png diff --git a/img/ch06/TVM.svg b/v1/img/ch06/TVM.svg similarity index 100% rename from img/ch06/TVM.svg rename to v1/img/ch06/TVM.svg diff --git a/img/ch06/TVM_cn.png b/v1/img/ch06/TVM_cn.png similarity index 100% rename from img/ch06/TVM_cn.png rename to v1/img/ch06/TVM_cn.png diff --git a/img/ch06/V100.svg b/v1/img/ch06/V100.svg similarity index 100% rename from img/ch06/V100.svg rename to v1/img/ch06/V100.svg diff --git a/img/ch06/V100_cn.png b/v1/img/ch06/V100_cn.png similarity index 100% rename from img/ch06/V100_cn.png rename to v1/img/ch06/V100_cn.png diff --git a/img/ch06/akg.png b/v1/img/ch06/akg.png similarity index 100% rename from img/ch06/akg.png rename to v1/img/ch06/akg.png diff --git a/img/ch06/akg_cn.png b/v1/img/ch06/akg_cn.png similarity index 100% rename from img/ch06/akg_cn.png rename to v1/img/ch06/akg_cn.png diff --git a/img/ch06/compute_unit.svg b/v1/img/ch06/compute_unit.svg similarity index 100% rename from img/ch06/compute_unit.svg rename to v1/img/ch06/compute_unit.svg diff --git a/img/ch06/compute_unit_cn.png b/v1/img/ch06/compute_unit_cn.png similarity index 100% rename from img/ch06/compute_unit_cn.png rename to v1/img/ch06/compute_unit_cn.png diff --git a/img/ch06/davinci_architecture.svg b/v1/img/ch06/davinci_architecture.svg similarity index 100% rename from img/ch06/davinci_architecture.svg rename to v1/img/ch06/davinci_architecture.svg diff --git a/img/ch06/gemm.svg b/v1/img/ch06/gemm.svg similarity index 100% rename from img/ch06/gemm.svg rename to v1/img/ch06/gemm.svg diff --git a/img/ch06/gemm_tensor_core.svg b/v1/img/ch06/gemm_tensor_core.svg similarity index 100% rename from img/ch06/gemm_tensor_core.svg rename to v1/img/ch06/gemm_tensor_core.svg diff --git a/img/ch06/ptx.svg b/v1/img/ch06/ptx.svg similarity index 100% rename from img/ch06/ptx.svg rename to v1/img/ch06/ptx.svg diff --git a/img/ch06/tensor_core.svg b/v1/img/ch06/tensor_core.svg similarity index 100% rename from img/ch06/tensor_core.svg rename to v1/img/ch06/tensor_core.svg diff --git a/img/ch07/7.1/pipeline.png b/v1/img/ch07/7.1/pipeline.png similarity index 100% rename from img/ch07/7.1/pipeline.png rename to v1/img/ch07/7.1/pipeline.png diff --git a/img/ch07/7.2/RDD.png b/v1/img/ch07/7.2/RDD.png similarity index 100% rename from img/ch07/7.2/RDD.png rename to v1/img/ch07/7.2/RDD.png diff --git a/img/ch07/7.2/dataset-plugin.png b/v1/img/ch07/7.2/dataset-plugin.png similarity index 100% rename from img/ch07/7.2/dataset-plugin.png rename to v1/img/ch07/7.2/dataset-plugin.png diff --git a/img/ch07/7.2/dataset.png b/v1/img/ch07/7.2/dataset.png similarity index 100% rename from img/ch07/7.2/dataset.png rename to v1/img/ch07/7.2/dataset.png diff --git a/img/ch07/7.2/dataset_table.png b/v1/img/ch07/7.2/dataset_table.png similarity index 100% rename from img/ch07/7.2/dataset_table.png rename to v1/img/ch07/7.2/dataset_table.png diff --git a/img/ch07/7.2/image_process_pipeline.png b/v1/img/ch07/7.2/image_process_pipeline.png similarity index 100% rename from img/ch07/7.2/image_process_pipeline.png rename to v1/img/ch07/7.2/image_process_pipeline.png diff --git a/img/ch07/7.2/operation.png b/v1/img/ch07/7.2/operation.png similarity index 100% rename from img/ch07/7.2/operation.png rename to v1/img/ch07/7.2/operation.png diff --git a/img/ch07/7.3/MindRecord_format.png b/v1/img/ch07/7.3/MindRecord_format.png similarity index 100% rename from img/ch07/7.3/MindRecord_format.png rename to v1/img/ch07/7.3/MindRecord_format.png diff --git a/img/ch07/7.3/async_data_process.png b/v1/img/ch07/7.3/async_data_process.png similarity index 100% rename from img/ch07/7.3/async_data_process.png rename to v1/img/ch07/7.3/async_data_process.png diff --git a/img/ch07/7.3/file_indexing.png b/v1/img/ch07/7.3/file_indexing.png similarity index 100% rename from img/ch07/7.3/file_indexing.png rename to v1/img/ch07/7.3/file_indexing.png diff --git a/img/ch07/7.3/map_reduce.png b/v1/img/ch07/7.3/map_reduce.png similarity index 100% rename from img/ch07/7.3/map_reduce.png rename to v1/img/ch07/7.3/map_reduce.png diff --git a/img/ch07/7.3/operator_parallisim.png b/v1/img/ch07/7.3/operator_parallisim.png similarity index 100% rename from img/ch07/7.3/operator_parallisim.png rename to v1/img/ch07/7.3/operator_parallisim.png diff --git a/img/ch07/7.3/partition.png b/v1/img/ch07/7.3/partition.png similarity index 100% rename from img/ch07/7.3/partition.png rename to v1/img/ch07/7.3/partition.png diff --git a/img/ch07/7.3/pipeline_parallisim.png b/v1/img/ch07/7.3/pipeline_parallisim.png similarity index 100% rename from img/ch07/7.3/pipeline_parallisim.png rename to v1/img/ch07/7.3/pipeline_parallisim.png diff --git a/img/ch07/7.3/pytorch_dataloader.png b/v1/img/ch07/7.3/pytorch_dataloader.png similarity index 100% rename from img/ch07/7.3/pytorch_dataloader.png rename to v1/img/ch07/7.3/pytorch_dataloader.png diff --git a/img/ch07/7.3/single_pipeline.png b/v1/img/ch07/7.3/single_pipeline.png similarity index 100% rename from img/ch07/7.3/single_pipeline.png rename to v1/img/ch07/7.3/single_pipeline.png diff --git a/img/ch07/7.3/uni_record.png b/v1/img/ch07/7.3/uni_record.png similarity index 100% rename from img/ch07/7.3/uni_record.png rename to v1/img/ch07/7.3/uni_record.png diff --git a/img/ch07/7.4/data_ordering.png b/v1/img/ch07/7.4/data_ordering.png similarity index 100% rename from img/ch07/7.4/data_ordering.png rename to v1/img/ch07/7.4/data_ordering.png diff --git a/img/ch07/7.4/mindspore_data_order.jpeg b/v1/img/ch07/7.4/mindspore_data_order.jpeg similarity index 100% rename from img/ch07/7.4/mindspore_data_order.jpeg rename to v1/img/ch07/7.4/mindspore_data_order.jpeg diff --git a/img/ch07/7.5/dali_overview.png b/v1/img/ch07/7.5/dali_overview.png similarity index 100% rename from img/ch07/7.5/dali_overview.png rename to v1/img/ch07/7.5/dali_overview.png diff --git a/img/ch08/AttentionTS.png b/v1/img/ch08/AttentionTS.png similarity index 100% rename from img/ch08/AttentionTS.png rename to v1/img/ch08/AttentionTS.png diff --git a/img/ch08/bn-replace.png b/v1/img/ch08/bn-replace.png similarity index 100% rename from img/ch08/bn-replace.png rename to v1/img/ch08/bn-replace.png diff --git a/img/ch08/conv-bn-fusion.png b/v1/img/ch08/conv-bn-fusion.png similarity index 100% rename from img/ch08/conv-bn-fusion.png rename to v1/img/ch08/conv-bn-fusion.png diff --git a/img/ch08/conv_2d.png b/v1/img/ch08/conv_2d.png similarity index 100% rename from img/ch08/conv_2d.png rename to v1/img/ch08/conv_2d.png diff --git a/img/ch08/conv_nhwc.png b/v1/img/ch08/conv_nhwc.png similarity index 100% rename from img/ch08/conv_nhwc.png rename to v1/img/ch08/conv_nhwc.png diff --git a/img/ch08/crop-reorder.png b/v1/img/ch08/crop-reorder.png similarity index 100% rename from img/ch08/crop-reorder.png rename to v1/img/ch08/crop-reorder.png diff --git a/img/ch08/deepcomp.png b/v1/img/ch08/deepcomp.png similarity index 100% rename from img/ch08/deepcomp.png rename to v1/img/ch08/deepcomp.png diff --git a/img/ch08/flow.png b/v1/img/ch08/flow.png similarity index 100% rename from img/ch08/flow.png rename to v1/img/ch08/flow.png diff --git a/img/ch08/fmla.png b/v1/img/ch08/fmla.png similarity index 100% rename from img/ch08/fmla.png rename to v1/img/ch08/fmla.png diff --git a/img/ch08/gemm.png b/v1/img/ch08/gemm.png similarity index 100% rename from img/ch08/gemm.png rename to v1/img/ch08/gemm.png diff --git a/img/ch08/img2col_input.png b/v1/img/ch08/img2col_input.png similarity index 100% rename from img/ch08/img2col_input.png rename to v1/img/ch08/img2col_input.png diff --git a/img/ch08/img2col_weight.png b/v1/img/ch08/img2col_weight.png similarity index 100% rename from img/ch08/img2col_weight.png rename to v1/img/ch08/img2col_weight.png diff --git a/img/ch08/model_obfuscate.png b/v1/img/ch08/model_obfuscate.png similarity index 100% rename from img/ch08/model_obfuscate.png rename to v1/img/ch08/model_obfuscate.png diff --git a/img/ch08/parallel.png b/v1/img/ch08/parallel.png similarity index 100% rename from img/ch08/parallel.png rename to v1/img/ch08/parallel.png diff --git a/img/ch08/quant-minmax-outpoints.png b/v1/img/ch08/quant-minmax-outpoints.png similarity index 100% rename from img/ch08/quant-minmax-outpoints.png rename to v1/img/ch08/quant-minmax-outpoints.png diff --git a/img/ch08/quant-minmax.png b/v1/img/ch08/quant-minmax.png similarity index 100% rename from img/ch08/quant-minmax.png rename to v1/img/ch08/quant-minmax.png diff --git a/img/ch08/register.png b/v1/img/ch08/register.png similarity index 100% rename from img/ch08/register.png rename to v1/img/ch08/register.png diff --git a/img/ch08/storage.png b/v1/img/ch08/storage.png similarity index 100% rename from img/ch08/storage.png rename to v1/img/ch08/storage.png diff --git a/img/ch08/winograd.png b/v1/img/ch08/winograd.png similarity index 100% rename from img/ch08/winograd.png rename to v1/img/ch08/winograd.png diff --git a/img/ch09/ch10-allreduce-process.png b/v1/img/ch09/ch10-allreduce-process.png similarity index 100% rename from img/ch09/ch10-allreduce-process.png rename to v1/img/ch09/ch10-allreduce-process.png diff --git a/img/ch09/ch10-allreduce-process.svg b/v1/img/ch09/ch10-allreduce-process.svg similarity index 100% rename from img/ch09/ch10-allreduce-process.svg rename to v1/img/ch09/ch10-allreduce-process.svg diff --git a/img/ch09/ch10-allreduce-state.png b/v1/img/ch09/ch10-allreduce-state.png similarity index 100% rename from img/ch09/ch10-allreduce-state.png rename to v1/img/ch09/ch10-allreduce-state.png diff --git a/img/ch09/ch10-allreduce-state.svg b/v1/img/ch09/ch10-allreduce-state.svg similarity index 100% rename from img/ch09/ch10-allreduce-state.svg rename to v1/img/ch09/ch10-allreduce-state.svg diff --git a/img/ch09/ch10-averaged-gradient.svg b/v1/img/ch09/ch10-averaged-gradient.svg similarity index 100% rename from img/ch09/ch10-averaged-gradient.svg rename to v1/img/ch09/ch10-averaged-gradient.svg diff --git a/img/ch09/ch10-collective-operators.png b/v1/img/ch09/ch10-collective-operators.png similarity index 100% rename from img/ch09/ch10-collective-operators.png rename to v1/img/ch09/ch10-collective-operators.png diff --git a/img/ch09/ch10-computation-increase.png b/v1/img/ch09/ch10-computation-increase.png similarity index 100% rename from img/ch09/ch10-computation-increase.png rename to v1/img/ch09/ch10-computation-increase.png diff --git a/img/ch09/ch10-computation-increase.svg b/v1/img/ch09/ch10-computation-increase.svg similarity index 100% rename from img/ch09/ch10-computation-increase.svg rename to v1/img/ch09/ch10-computation-increase.svg diff --git a/img/ch09/ch10-data-parallel.png b/v1/img/ch09/ch10-data-parallel.png similarity index 100% rename from img/ch09/ch10-data-parallel.png rename to v1/img/ch09/ch10-data-parallel.png diff --git a/img/ch09/ch10-data-parallel.svg b/v1/img/ch09/ch10-data-parallel.svg similarity index 100% rename from img/ch09/ch10-data-parallel.svg rename to v1/img/ch09/ch10-data-parallel.svg diff --git a/img/ch09/ch10-datacentre.png b/v1/img/ch09/ch10-datacentre.png similarity index 100% rename from img/ch09/ch10-datacentre.png rename to v1/img/ch09/ch10-datacentre.png diff --git a/img/ch09/ch10-datacentre.svg b/v1/img/ch09/ch10-datacentre.svg similarity index 100% rename from img/ch09/ch10-datacentre.svg rename to v1/img/ch09/ch10-datacentre.svg diff --git a/img/ch09/ch10-hybrid-parallel.png b/v1/img/ch09/ch10-hybrid-parallel.png similarity index 100% rename from img/ch09/ch10-hybrid-parallel.png rename to v1/img/ch09/ch10-hybrid-parallel.png diff --git a/img/ch09/ch10-hybrid-parallel.svg b/v1/img/ch09/ch10-hybrid-parallel.svg similarity index 100% rename from img/ch09/ch10-hybrid-parallel.svg rename to v1/img/ch09/ch10-hybrid-parallel.svg diff --git a/img/ch09/ch10-model-parallel-inter-op.png b/v1/img/ch09/ch10-model-parallel-inter-op.png similarity index 100% rename from img/ch09/ch10-model-parallel-inter-op.png rename to v1/img/ch09/ch10-model-parallel-inter-op.png diff --git a/img/ch09/ch10-model-parallel-inter-op.svg b/v1/img/ch09/ch10-model-parallel-inter-op.svg similarity index 100% rename from img/ch09/ch10-model-parallel-inter-op.svg rename to v1/img/ch09/ch10-model-parallel-inter-op.svg diff --git a/img/ch09/ch10-model-parallel-intra-op.png b/v1/img/ch09/ch10-model-parallel-intra-op.png similarity index 100% rename from img/ch09/ch10-model-parallel-intra-op.png rename to v1/img/ch09/ch10-model-parallel-intra-op.png diff --git a/img/ch09/ch10-parameter-server-replication.svg b/v1/img/ch09/ch10-parameter-server-replication.svg similarity index 100% rename from img/ch09/ch10-parameter-server-replication.svg rename to v1/img/ch09/ch10-parameter-server-replication.svg diff --git a/img/ch09/ch10-parameter-servers.png b/v1/img/ch09/ch10-parameter-servers.png similarity index 100% rename from img/ch09/ch10-parameter-servers.png rename to v1/img/ch09/ch10-parameter-servers.png diff --git a/img/ch09/ch10-parameter-servers.svg b/v1/img/ch09/ch10-parameter-servers.svg similarity index 100% rename from img/ch09/ch10-parameter-servers.svg rename to v1/img/ch09/ch10-parameter-servers.svg diff --git a/img/ch09/ch10-pipeline-parallel.png b/v1/img/ch09/ch10-pipeline-parallel.png similarity index 100% rename from img/ch09/ch10-pipeline-parallel.png rename to v1/img/ch09/ch10-pipeline-parallel.png diff --git a/img/ch09/ch10-pipeline-parallel.svg b/v1/img/ch09/ch10-pipeline-parallel.svg similarity index 100% rename from img/ch09/ch10-pipeline-parallel.svg rename to v1/img/ch09/ch10-pipeline-parallel.svg diff --git a/img/ch09/ch10-recommendation-model.svg b/v1/img/ch09/ch10-recommendation-model.svg similarity index 100% rename from img/ch09/ch10-recommendation-model.svg rename to v1/img/ch09/ch10-recommendation-model.svg diff --git a/img/ch09/ch10-redistribution.pdf b/v1/img/ch09/ch10-redistribution.pdf similarity index 100% rename from img/ch09/ch10-redistribution.pdf rename to v1/img/ch09/ch10-redistribution.pdf diff --git a/img/ch09/ch10-redistribution.png b/v1/img/ch09/ch10-redistribution.png similarity index 100% rename from img/ch09/ch10-redistribution.png rename to v1/img/ch09/ch10-redistribution.png diff --git a/img/ch09/ch10-single-node.png b/v1/img/ch09/ch10-single-node.png similarity index 100% rename from img/ch09/ch10-single-node.png rename to v1/img/ch09/ch10-single-node.png diff --git a/img/ch09/ch10-single-node.svg b/v1/img/ch09/ch10-single-node.svg similarity index 100% rename from img/ch09/ch10-single-node.svg rename to v1/img/ch09/ch10-single-node.svg diff --git a/img/ch09/ch10-single-vs-multi.png b/v1/img/ch09/ch10-single-vs-multi.png similarity index 100% rename from img/ch09/ch10-single-vs-multi.png rename to v1/img/ch09/ch10-single-vs-multi.png diff --git a/img/ch09/ch10-single-vs-multi.svg b/v1/img/ch09/ch10-single-vs-multi.svg similarity index 100% rename from img/ch09/ch10-single-vs-multi.svg rename to v1/img/ch09/ch10-single-vs-multi.svg diff --git a/img/ch10/ch-recsys/ch10-recommendation-models.png b/v1/img/ch10/ch-recsys/ch10-recommendation-models.png similarity index 100% rename from img/ch10/ch-recsys/ch10-recommendation-models.png rename to v1/img/ch10/ch-recsys/ch10-recommendation-models.png diff --git a/img/ch10/ch-recsys/ch10-recommendation-systems.png b/v1/img/ch10/ch-recsys/ch10-recommendation-systems.png similarity index 100% rename from img/ch10/ch-recsys/ch10-recommendation-systems.png rename to v1/img/ch10/ch-recsys/ch10-recommendation-systems.png diff --git a/img/ch10/ch-recsys/chain_replication.png b/v1/img/ch10/ch-recsys/chain_replication.png similarity index 100% rename from img/ch10/ch-recsys/chain_replication.png rename to v1/img/ch10/ch-recsys/chain_replication.png diff --git a/img/ch10/ch-recsys/content_embedding_missing.png b/v1/img/ch10/ch-recsys/content_embedding_missing.png similarity index 100% rename from img/ch10/ch-recsys/content_embedding_missing.png rename to v1/img/ch10/ch-recsys/content_embedding_missing.png diff --git a/img/ch10/ch-recsys/dlrm_model.png b/v1/img/ch10/ch-recsys/dlrm_model.png similarity index 100% rename from img/ch10/ch-recsys/dlrm_model.png rename to v1/img/ch10/ch-recsys/dlrm_model.png diff --git a/img/ch10/ch-recsys/ekko_overview.png b/v1/img/ch10/ch-recsys/ekko_overview.png similarity index 100% rename from img/ch10/ch-recsys/ekko_overview.png rename to v1/img/ch10/ch-recsys/ekko_overview.png diff --git a/img/ch10/ch-recsys/feature_store.png b/v1/img/ch10/ch-recsys/feature_store.png similarity index 100% rename from img/ch10/ch-recsys/feature_store.png rename to v1/img/ch10/ch-recsys/feature_store.png diff --git a/img/ch10/ch-recsys/interaction.png b/v1/img/ch10/ch-recsys/interaction.png similarity index 100% rename from img/ch10/ch-recsys/interaction.png rename to v1/img/ch10/ch-recsys/interaction.png diff --git a/img/ch10/ch-recsys/offline_update.png b/v1/img/ch10/ch-recsys/offline_update.png similarity index 100% rename from img/ch10/ch-recsys/offline_update.png rename to v1/img/ch10/ch-recsys/offline_update.png diff --git a/img/ch10/ch-recsys/online_update.png b/v1/img/ch10/ch-recsys/online_update.png similarity index 100% rename from img/ch10/ch-recsys/online_update.png rename to v1/img/ch10/ch-recsys/online_update.png diff --git a/img/ch10/ch-recsys/p2p_replication.png b/v1/img/ch10/ch-recsys/p2p_replication.png similarity index 100% rename from img/ch10/ch-recsys/p2p_replication.png rename to v1/img/ch10/ch-recsys/p2p_replication.png diff --git a/img/ch10/ch-recsys/parameter_server_in_recommendation.png b/v1/img/ch10/ch-recsys/parameter_server_in_recommendation.png similarity index 100% rename from img/ch10/ch-recsys/parameter_server_in_recommendation.png rename to v1/img/ch10/ch-recsys/parameter_server_in_recommendation.png diff --git a/img/ch10/ch-recsys/recommender_pipeline.png b/v1/img/ch10/ch-recsys/recommender_pipeline.png similarity index 100% rename from img/ch10/ch-recsys/recommender_pipeline.png rename to v1/img/ch10/ch-recsys/recommender_pipeline.png diff --git a/img/ch10/ch-recsys/state_manager.png b/v1/img/ch10/ch-recsys/state_manager.png similarity index 100% rename from img/ch10/ch-recsys/state_manager.png rename to v1/img/ch10/ch-recsys/state_manager.png diff --git a/img/ch10/ch-recsys/system_challenges.png b/v1/img/ch10/ch-recsys/system_challenges.png similarity index 100% rename from img/ch10/ch-recsys/system_challenges.png rename to v1/img/ch10/ch-recsys/system_challenges.png diff --git a/img/ch10/ch-recsys/two_tower_model.png b/v1/img/ch10/ch-recsys/two_tower_model.png similarity index 100% rename from img/ch10/ch-recsys/two_tower_model.png rename to v1/img/ch10/ch-recsys/two_tower_model.png diff --git a/img/ch10/ch-recsys/update_scheduler.png b/v1/img/ch10/ch-recsys/update_scheduler.png similarity index 100% rename from img/ch10/ch-recsys/update_scheduler.png rename to v1/img/ch10/ch-recsys/update_scheduler.png diff --git a/img/ch10/ch-recsys/user_embedding_missing.png b/v1/img/ch10/ch-recsys/user_embedding_missing.png similarity index 100% rename from img/ch10/ch-recsys/user_embedding_missing.png rename to v1/img/ch10/ch-recsys/user_embedding_missing.png diff --git a/img/ch10/ch10-abstract-recommendation-systems.png b/v1/img/ch10/ch10-abstract-recommendation-systems.png similarity index 100% rename from img/ch10/ch10-abstract-recommendation-systems.png rename to v1/img/ch10/ch10-abstract-recommendation-systems.png diff --git a/img/ch10/ch10-abstract-recommendation-systems.svg b/v1/img/ch10/ch10-abstract-recommendation-systems.svg similarity index 100% rename from img/ch10/ch10-abstract-recommendation-systems.svg rename to v1/img/ch10/ch10-abstract-recommendation-systems.svg diff --git a/img/ch10/ch10-federated-learning-architecture.svg b/v1/img/ch10/ch10-federated-learning-architecture.svg similarity index 100% rename from img/ch10/ch10-federated-learning-architecture.svg rename to v1/img/ch10/ch10-federated-learning-architecture.svg diff --git a/img/ch10/ch10-federated-learning-different-connection.png b/v1/img/ch10/ch10-federated-learning-different-connection.png similarity index 100% rename from img/ch10/ch10-federated-learning-different-connection.png rename to v1/img/ch10/ch10-federated-learning-different-connection.png diff --git a/img/ch10/ch10-federated-learning-fedavg.png b/v1/img/ch10/ch10-federated-learning-fedavg.png similarity index 100% rename from img/ch10/ch10-federated-learning-fedavg.png rename to v1/img/ch10/ch10-federated-learning-fedavg.png diff --git a/img/ch10/ch10-federated-learning-flow.png b/v1/img/ch10/ch10-federated-learning-flow.png similarity index 100% rename from img/ch10/ch10-federated-learning-flow.png rename to v1/img/ch10/ch10-federated-learning-flow.png diff --git a/img/ch10/ch10-federated-learning-signds.PNG b/v1/img/ch10/ch10-federated-learning-signds.PNG similarity index 100% rename from img/ch10/ch10-federated-learning-signds.PNG rename to v1/img/ch10/ch10-federated-learning-signds.PNG diff --git a/img/ch10/ch10-federated-learning-vfl-arch.svg b/v1/img/ch10/ch10-federated-learning-vfl-arch.svg similarity index 100% rename from img/ch10/ch10-federated-learning-vfl-arch.svg rename to v1/img/ch10/ch10-federated-learning-vfl-arch.svg diff --git a/img/ch10/ch10-federated-learning-vfl-data.png b/v1/img/ch10/ch10-federated-learning-vfl-data.png similarity index 100% rename from img/ch10/ch10-federated-learning-vfl-data.png rename to v1/img/ch10/ch10-federated-learning-vfl-data.png diff --git a/img/ch10/ch10-federated-learning-vfl-train.svg b/v1/img/ch10/ch10-federated-learning-vfl-train.svg similarity index 100% rename from img/ch10/ch10-federated-learning-vfl-train.svg rename to v1/img/ch10/ch10-federated-learning-vfl-train.svg diff --git a/img/ch10/ch10-recommendation-models.png b/v1/img/ch10/ch10-recommendation-models.png similarity index 100% rename from img/ch10/ch10-recommendation-models.png rename to v1/img/ch10/ch10-recommendation-models.png diff --git a/img/ch10/ch10-recommendation-models.svg b/v1/img/ch10/ch10-recommendation-models.svg similarity index 100% rename from img/ch10/ch10-recommendation-models.svg rename to v1/img/ch10/ch10-recommendation-models.svg diff --git a/img/ch10/ch10-recommendation-systems.png b/v1/img/ch10/ch10-recommendation-systems.png similarity index 100% rename from img/ch10/ch10-recommendation-systems.png rename to v1/img/ch10/ch10-recommendation-systems.png diff --git a/img/ch10/ch10-recommendation-systems.svg b/v1/img/ch10/ch10-recommendation-systems.svg similarity index 100% rename from img/ch10/ch10-recommendation-systems.svg rename to v1/img/ch10/ch10-recommendation-systems.svg diff --git a/img/ch11/XAI_methods.PNG b/v1/img/ch11/XAI_methods.PNG similarity index 100% rename from img/ch11/XAI_methods.PNG rename to v1/img/ch11/XAI_methods.PNG diff --git a/img/ch11/correct_correct.png b/v1/img/ch11/correct_correct.png similarity index 100% rename from img/ch11/correct_correct.png rename to v1/img/ch11/correct_correct.png diff --git a/img/ch11/correct_wrong.png b/v1/img/ch11/correct_wrong.png similarity index 100% rename from img/ch11/correct_wrong.png rename to v1/img/ch11/correct_wrong.png diff --git a/img/ch11/mindspore_xai.png b/v1/img/ch11/mindspore_xai.png similarity index 100% rename from img/ch11/mindspore_xai.png rename to v1/img/ch11/mindspore_xai.png diff --git a/img/ch11/tabular.png b/v1/img/ch11/tabular.png similarity index 100% rename from img/ch11/tabular.png rename to v1/img/ch11/tabular.png diff --git a/img/ch11/tabular_shap.png b/v1/img/ch11/tabular_shap.png similarity index 100% rename from img/ch11/tabular_shap.png rename to v1/img/ch11/tabular_shap.png diff --git a/img/ch11/tb_net.png b/v1/img/ch11/tb_net.png similarity index 100% rename from img/ch11/tb_net.png rename to v1/img/ch11/tb_net.png diff --git a/img/ch11/tbnet_finance.png b/v1/img/ch11/tbnet_finance.png similarity index 100% rename from img/ch11/tbnet_finance.png rename to v1/img/ch11/tbnet_finance.png diff --git a/img/ch11/wrong_wrong.png b/v1/img/ch11/wrong_wrong.png similarity index 100% rename from img/ch11/wrong_wrong.png rename to v1/img/ch11/wrong_wrong.png diff --git a/img/ch11/xai_concept.png b/v1/img/ch11/xai_concept.png similarity index 100% rename from img/ch11/xai_concept.png rename to v1/img/ch11/xai_concept.png diff --git a/img/ch11/xai_concept_en.PNG b/v1/img/ch11/xai_concept_en.PNG similarity index 100% rename from img/ch11/xai_concept_en.PNG rename to v1/img/ch11/xai_concept_en.PNG diff --git a/img/ch11/xai_data_driven.png b/v1/img/ch11/xai_data_driven.png similarity index 100% rename from img/ch11/xai_data_driven.png rename to v1/img/ch11/xai_data_driven.png diff --git a/img/ch11/xai_global_feature_importance.png b/v1/img/ch11/xai_global_feature_importance.png similarity index 100% rename from img/ch11/xai_global_feature_importance.png rename to v1/img/ch11/xai_global_feature_importance.png diff --git a/img/ch11/xai_gradient_based.PNG b/v1/img/ch11/xai_gradient_based.PNG similarity index 100% rename from img/ch11/xai_gradient_based.PNG rename to v1/img/ch11/xai_gradient_based.PNG diff --git a/img/ch11/xai_kg_recommendation.png b/v1/img/ch11/xai_kg_recommendation.png similarity index 100% rename from img/ch11/xai_kg_recommendation.png rename to v1/img/ch11/xai_kg_recommendation.png diff --git a/img/ch11/xai_lime.png b/v1/img/ch11/xai_lime.png similarity index 100% rename from img/ch11/xai_lime.png rename to v1/img/ch11/xai_lime.png diff --git a/img/ch11/xai_tcav.png b/v1/img/ch11/xai_tcav.png similarity index 100% rename from img/ch11/xai_tcav.png rename to v1/img/ch11/xai_tcav.png diff --git a/img/ch12/ch12-a3c.pdf b/v1/img/ch12/ch12-a3c.pdf similarity index 100% rename from img/ch12/ch12-a3c.pdf rename to v1/img/ch12/ch12-a3c.pdf diff --git a/img/ch12/ch12-a3c.png b/v1/img/ch12/ch12-a3c.png similarity index 100% rename from img/ch12/ch12-a3c.png rename to v1/img/ch12/ch12-a3c.png diff --git a/img/ch12/ch12-impala.pdf b/v1/img/ch12/ch12-impala.pdf similarity index 100% rename from img/ch12/ch12-impala.pdf rename to v1/img/ch12/ch12-impala.pdf diff --git a/img/ch12/ch12-impala.png b/v1/img/ch12/ch12-impala.png similarity index 100% rename from img/ch12/ch12-impala.png rename to v1/img/ch12/ch12-impala.png diff --git a/img/ch12/ch12-marl-fsp.pdf b/v1/img/ch12/ch12-marl-fsp.pdf similarity index 100% rename from img/ch12/ch12-marl-fsp.pdf rename to v1/img/ch12/ch12-marl-fsp.pdf diff --git a/img/ch12/ch12-marl-fsp.png b/v1/img/ch12/ch12-marl-fsp.png similarity index 100% rename from img/ch12/ch12-marl-fsp.png rename to v1/img/ch12/ch12-marl-fsp.png diff --git a/img/ch12/ch12-marl-sp.pdf b/v1/img/ch12/ch12-marl-sp.pdf similarity index 100% rename from img/ch12/ch12-marl-sp.pdf rename to v1/img/ch12/ch12-marl-sp.pdf diff --git a/img/ch12/ch12-marl-sp.png b/v1/img/ch12/ch12-marl-sp.png similarity index 100% rename from img/ch12/ch12-marl-sp.png rename to v1/img/ch12/ch12-marl-sp.png diff --git a/img/ch12/ch12-marl-sys.png b/v1/img/ch12/ch12-marl-sys.png similarity index 100% rename from img/ch12/ch12-marl-sys.png rename to v1/img/ch12/ch12-marl-sys.png diff --git a/img/ch12/ch12-marl-sys.svg b/v1/img/ch12/ch12-marl-sys.svg similarity index 100% rename from img/ch12/ch12-marl-sys.svg rename to v1/img/ch12/ch12-marl-sys.svg diff --git a/img/ch12/ch12-marl-train.pdf b/v1/img/ch12/ch12-marl-train.pdf similarity index 100% rename from img/ch12/ch12-marl-train.pdf rename to v1/img/ch12/ch12-marl-train.pdf diff --git a/img/ch12/ch12-marl-train.png b/v1/img/ch12/ch12-marl-train.png similarity index 100% rename from img/ch12/ch12-marl-train.png rename to v1/img/ch12/ch12-marl-train.png diff --git a/img/ch12/ch12-marl-train.svg b/v1/img/ch12/ch12-marl-train.svg similarity index 100% rename from img/ch12/ch12-marl-train.svg rename to v1/img/ch12/ch12-marl-train.svg diff --git a/img/ch12/ch12-marl.pdf b/v1/img/ch12/ch12-marl.pdf similarity index 100% rename from img/ch12/ch12-marl.pdf rename to v1/img/ch12/ch12-marl.pdf diff --git a/img/ch12/ch12-marl.png b/v1/img/ch12/ch12-marl.png similarity index 100% rename from img/ch12/ch12-marl.png rename to v1/img/ch12/ch12-marl.png diff --git a/img/ch12/ch12-rl.pdf b/v1/img/ch12/ch12-rl.pdf similarity index 100% rename from img/ch12/ch12-rl.pdf rename to v1/img/ch12/ch12-rl.pdf diff --git a/img/ch12/ch12-rl.png b/v1/img/ch12/ch12-rl.png similarity index 100% rename from img/ch12/ch12-rl.png rename to v1/img/ch12/ch12-rl.png diff --git a/img/ch12/ch12-rllib-arch.png b/v1/img/ch12/ch12-rllib-arch.png similarity index 100% rename from img/ch12/ch12-rllib-arch.png rename to v1/img/ch12/ch12-rllib-arch.png diff --git a/img/ch12/ch12-rllib-arch.svg b/v1/img/ch12/ch12-rllib-arch.svg similarity index 100% rename from img/ch12/ch12-rllib-arch.svg rename to v1/img/ch12/ch12-rllib-arch.svg diff --git a/img/ch12/ch12-rllib-distributed.png b/v1/img/ch12/ch12-rllib-distributed.png similarity index 100% rename from img/ch12/ch12-rllib-distributed.png rename to v1/img/ch12/ch12-rllib-distributed.png diff --git a/img/ch12/ch12-rllib-distributed.svg b/v1/img/ch12/ch12-rllib-distributed.svg similarity index 100% rename from img/ch12/ch12-rllib-distributed.svg rename to v1/img/ch12/ch12-rllib-distributed.svg diff --git a/img/ch12/ch12-rlzoo.pdf b/v1/img/ch12/ch12-rlzoo.pdf similarity index 100% rename from img/ch12/ch12-rlzoo.pdf rename to v1/img/ch12/ch12-rlzoo.pdf diff --git a/img/ch12/ch12-rlzoo.png b/v1/img/ch12/ch12-rlzoo.png similarity index 100% rename from img/ch12/ch12-rlzoo.png rename to v1/img/ch12/ch12-rlzoo.png diff --git a/img/ch13/ROS2_arch.png b/v1/img/ch13/ROS2_arch.png similarity index 100% rename from img/ch13/ROS2_arch.png rename to v1/img/ch13/ROS2_arch.png diff --git a/img/ch13/affordance.png b/v1/img/ch13/affordance.png similarity index 100% rename from img/ch13/affordance.png rename to v1/img/ch13/affordance.png diff --git a/img/ch13/idm.png b/v1/img/ch13/idm.png similarity index 100% rename from img/ch13/idm.png rename to v1/img/ch13/idm.png diff --git a/img/ch13/orbslam3.png b/v1/img/ch13/orbslam3.png similarity index 100% rename from img/ch13/orbslam3.png rename to v1/img/ch13/orbslam3.png diff --git a/img/ch13/real-world.png b/v1/img/ch13/real-world.png similarity index 100% rename from img/ch13/real-world.png rename to v1/img/ch13/real-world.png diff --git a/img/ch13/rl_ad.png b/v1/img/ch13/rl_ad.png similarity index 100% rename from img/ch13/rl_ad.png rename to v1/img/ch13/rl_ad.png diff --git a/img/ch13/robot_learning_overview.png b/v1/img/ch13/robot_learning_overview.png similarity index 100% rename from img/ch13/robot_learning_overview.png rename to v1/img/ch13/robot_learning_overview.png diff --git a/img/ch13/ros-apple.jpg b/v1/img/ch13/ros-apple.jpg similarity index 100% rename from img/ch13/ros-apple.jpg rename to v1/img/ch13/ros-apple.jpg diff --git a/img/ch13/ros-pineapple.jpg b/v1/img/ch13/ros-pineapple.jpg similarity index 100% rename from img/ch13/ros-pineapple.jpg rename to v1/img/ch13/ros-pineapple.jpg diff --git a/img/ch13/ros2-gazebo-1.JPG b/v1/img/ch13/ros2-gazebo-1.JPG similarity index 100% rename from img/ch13/ros2-gazebo-1.JPG rename to v1/img/ch13/ros2-gazebo-1.JPG diff --git a/img/ch13/ros2-rviz-1.JPG b/v1/img/ch13/ros2-rviz-1.JPG similarity index 100% rename from img/ch13/ros2-rviz-1.JPG rename to v1/img/ch13/ros2-rviz-1.JPG diff --git a/img/ch13/ros2-rviz-2.JPG b/v1/img/ch13/ros2-rviz-2.JPG similarity index 100% rename from img/ch13/ros2-rviz-2.JPG rename to v1/img/ch13/ros2-rviz-2.JPG diff --git a/img/ch13/ros2_actions.png b/v1/img/ch13/ros2_actions.png similarity index 100% rename from img/ch13/ros2_actions.png rename to v1/img/ch13/ros2_actions.png diff --git a/img/ch13/ros2_graph.png b/v1/img/ch13/ros2_graph.png similarity index 100% rename from img/ch13/ros2_graph.png rename to v1/img/ch13/ros2_graph.png diff --git a/img/ch13/ros2_services.png b/v1/img/ch13/ros2_services.png similarity index 100% rename from img/ch13/ros2_services.png rename to v1/img/ch13/ros2_services.png diff --git a/img/ch13/ros2_topics.png b/v1/img/ch13/ros2_topics.png similarity index 100% rename from img/ch13/ros2_topics.png rename to v1/img/ch13/ros2_topics.png diff --git a/img/ch13/safe_learning_control.png b/v1/img/ch13/safe_learning_control.png similarity index 100% rename from img/ch13/safe_learning_control.png rename to v1/img/ch13/safe_learning_control.png diff --git a/img/ch13/simulator.png b/v1/img/ch13/simulator.png similarity index 100% rename from img/ch13/simulator.png rename to v1/img/ch13/simulator.png diff --git a/img/ch13/vehicle_computing.png b/v1/img/ch13/vehicle_computing.png similarity index 100% rename from img/ch13/vehicle_computing.png rename to v1/img/ch13/vehicle_computing.png diff --git a/img/ch_basic/conv_computation_v4.png b/v1/img/ch_basic/conv_computation_v4.png similarity index 100% rename from img/ch_basic/conv_computation_v4.png rename to v1/img/ch_basic/conv_computation_v4.png diff --git a/img/ch_basic/gradient_descent2.png b/v1/img/ch_basic/gradient_descent2.png similarity index 100% rename from img/ch_basic/gradient_descent2.png rename to v1/img/ch_basic/gradient_descent2.png diff --git a/img/ch_basic/mlp2.png b/v1/img/ch_basic/mlp2.png similarity index 100% rename from img/ch_basic/mlp2.png rename to v1/img/ch_basic/mlp2.png diff --git a/img/ch_basic/pooling_v3.png b/v1/img/ch_basic/pooling_v3.png similarity index 100% rename from img/ch_basic/pooling_v3.png rename to v1/img/ch_basic/pooling_v3.png diff --git a/img/ch_basic/rnn_simple_cell2.png b/v1/img/ch_basic/rnn_simple_cell2.png similarity index 100% rename from img/ch_basic/rnn_simple_cell2.png rename to v1/img/ch_basic/rnn_simple_cell2.png diff --git a/img/ch_basic/single_neuron2.png b/v1/img/ch_basic/single_neuron2.png similarity index 100% rename from img/ch_basic/single_neuron2.png rename to v1/img/ch_basic/single_neuron2.png diff --git a/img/ch_basic/single_neuron_bias2.png b/v1/img/ch_basic/single_neuron_bias2.png similarity index 100% rename from img/ch_basic/single_neuron_bias2.png rename to v1/img/ch_basic/single_neuron_bias2.png diff --git a/img/ch_basic/single_neuron_decision_boundary2.png b/v1/img/ch_basic/single_neuron_decision_boundary2.png similarity index 100% rename from img/ch_basic/single_neuron_decision_boundary2.png rename to v1/img/ch_basic/single_neuron_decision_boundary2.png diff --git a/img/ch_basic/two_neurons2.png b/v1/img/ch_basic/two_neurons2.png similarity index 100% rename from img/ch_basic/two_neurons2.png rename to v1/img/ch_basic/two_neurons2.png diff --git a/img/guide/step1.png b/v1/img/guide/step1.png similarity index 100% rename from img/guide/step1.png rename to v1/img/guide/step1.png diff --git a/img/guide/step2.png b/v1/img/guide/step2.png similarity index 100% rename from img/guide/step2.png rename to v1/img/guide/step2.png diff --git a/img/guide/step3.png b/v1/img/guide/step3.png similarity index 100% rename from img/guide/step3.png rename to v1/img/guide/step3.png diff --git a/img/guide/step4.png b/v1/img/guide/step4.png similarity index 100% rename from img/guide/step4.png rename to v1/img/guide/step4.png diff --git a/img/guide/step5.png b/v1/img/guide/step5.png similarity index 100% rename from img/guide/step5.png rename to v1/img/guide/step5.png diff --git a/img/guide/step6.png b/v1/img/guide/step6.png similarity index 100% rename from img/guide/step6.png rename to v1/img/guide/step6.png diff --git a/en_chapters/mlsys.bib b/v1/mlsys.bib similarity index 100% rename from en_chapters/mlsys.bib rename to v1/mlsys.bib diff --git a/references/accelerator.bib b/v1/references/accelerator.bib similarity index 100% rename from references/accelerator.bib rename to v1/references/accelerator.bib diff --git a/references/appendix.bib b/v1/references/appendix.bib similarity index 100% rename from references/appendix.bib rename to v1/references/appendix.bib diff --git a/references/backend.bib b/v1/references/backend.bib similarity index 100% rename from references/backend.bib rename to v1/references/backend.bib diff --git a/references/data.bib b/v1/references/data.bib similarity index 100% rename from references/data.bib rename to v1/references/data.bib diff --git a/references/explainable.bib b/v1/references/explainable.bib similarity index 100% rename from references/explainable.bib rename to v1/references/explainable.bib diff --git a/references/extension.bib b/v1/references/extension.bib similarity index 100% rename from references/extension.bib rename to v1/references/extension.bib diff --git a/references/federated.bib b/v1/references/federated.bib similarity index 100% rename from references/federated.bib rename to v1/references/federated.bib diff --git a/references/frontend.bib b/v1/references/frontend.bib similarity index 100% rename from references/frontend.bib rename to v1/references/frontend.bib diff --git a/references/graph.bib b/v1/references/graph.bib similarity index 100% rename from references/graph.bib rename to v1/references/graph.bib diff --git a/references/interface.bib b/v1/references/interface.bib similarity index 100% rename from references/interface.bib rename to v1/references/interface.bib diff --git a/references/introduction.bib b/v1/references/introduction.bib similarity index 100% rename from references/introduction.bib rename to v1/references/introduction.bib diff --git a/references/model.bib b/v1/references/model.bib similarity index 100% rename from references/model.bib rename to v1/references/model.bib diff --git a/references/model_deployment.bib b/v1/references/model_deployment.bib similarity index 100% rename from references/model_deployment.bib rename to v1/references/model_deployment.bib diff --git a/references/recommender.bib b/v1/references/recommender.bib similarity index 100% rename from references/recommender.bib rename to v1/references/recommender.bib diff --git a/references/reinforcement.bib b/v1/references/reinforcement.bib similarity index 100% rename from references/reinforcement.bib rename to v1/references/reinforcement.bib diff --git a/references/rlsys.bib b/v1/references/rlsys.bib similarity index 100% rename from references/rlsys.bib rename to v1/references/rlsys.bib diff --git a/references/training.bib b/v1/references/training.bib similarity index 100% rename from references/training.bib rename to v1/references/training.bib diff --git a/static/favicon.png b/v1/static/favicon.png similarity index 100% rename from static/favicon.png rename to v1/static/favicon.png diff --git a/static/frontpage.html b/v1/static/frontpage.html similarity index 100% rename from static/frontpage.html rename to v1/static/frontpage.html diff --git a/static/image/guozhijian.png b/v1/static/image/guozhijian.png similarity index 100% rename from static/image/guozhijian.png rename to v1/static/image/guozhijian.png diff --git a/static/image/jinxuefeng.png b/v1/static/image/jinxuefeng.png similarity index 100% rename from static/image/jinxuefeng.png rename to v1/static/image/jinxuefeng.png diff --git a/static/image/logo.png b/v1/static/image/logo.png similarity index 100% rename from static/image/logo.png rename to v1/static/image/logo.png diff --git a/static/image/wanghanchen.png b/v1/static/image/wanghanchen.png similarity index 100% rename from static/image/wanghanchen.png rename to v1/static/image/wanghanchen.png diff --git a/static/image/wutiancheng.png b/v1/static/image/wutiancheng.png similarity index 100% rename from static/image/wutiancheng.png rename to v1/static/image/wutiancheng.png diff --git a/static/image/zhaizhiqiang.png b/v1/static/image/zhaizhiqiang.png similarity index 100% rename from static/image/zhaizhiqiang.png rename to v1/static/image/zhaizhiqiang.png diff --git a/static/image/zhangqinghua.png b/v1/static/image/zhangqinghua.png similarity index 100% rename from static/image/zhangqinghua.png rename to v1/static/image/zhangqinghua.png diff --git a/static/image/zhangrenwei.png b/v1/static/image/zhangrenwei.png similarity index 100% rename from static/image/zhangrenwei.png rename to v1/static/image/zhangrenwei.png diff --git a/static/logo-with-text.png b/v1/static/logo-with-text.png similarity index 100% rename from static/logo-with-text.png rename to v1/static/logo-with-text.png diff --git a/static/logo.png b/v1/static/logo.png similarity index 100% rename from static/logo.png rename to v1/static/logo.png diff --git a/static/readme.md b/v1/static/readme.md similarity index 100% rename from static/readme.md rename to v1/static/readme.md diff --git a/zh_chapters/SUMMARY.md b/zh_chapters/SUMMARY.md deleted file mode 100644 index 49f4c38..0000000 --- a/zh_chapters/SUMMARY.md +++ /dev/null @@ -1,110 +0,0 @@ -# Summary - -[机器学习系统:设计和实现](index.md) -[前言](chapter_preface/index.md) - -# 基础篇 - -- [导论](chapter_introduction/index.md) - - [机器学习应用](chapter_introduction/applications.md) - - [机器学习框架的设计目标](chapter_introduction/design.md) - - [机器学习框架的基本组成原理](chapter_introduction/architecture.md) - - [机器学习系统生态](chapter_introduction/ecosystem.md) - - [图书结构和读者](chapter_introduction/readers.md) -- [编程接口](chapter_programming_interface/index.md) - - [机器学习系统编程模型的演进](chapter_programming_interface/development_history.md) - - [机器学习工作流](chapter_programming_interface/ml_workflow.md) - - [定义深度神经网络](chapter_programming_interface/neural_network_layer.md) - - [C/C++编程接口](chapter_programming_interface/c_python_interaction.md) - - [机器学习框架的编程范式](chapter_programming_interface/ml_programming_paradigm.md) - - [总结](chapter_programming_interface/summary.md) -- [计算图](chapter_computational_graph/index.md) - - [计算图的设计背景和作用](chapter_computational_graph/background_and_functionality.md) - - [计算图的基本构成](chapter_computational_graph/components_of_computational_graph.md) - - [计算图的生成](chapter_computational_graph/generation_of_computational_graph.md) - - [计算图的调度](chapter_computational_graph/schedule_of_computational_graph.md) - - [总结](chapter_computational_graph/summary.md) - -# 进阶篇 - -- [导读](chapter_preface_advanced/index.md) -- [AI编译器和前端技术](chapter_frontend_and_ir/index.md) - - [AI编译器设计原理](chapter_frontend_and_ir/ai_compiler_design_principle.md) - - [AI编译器前端技术概述](chapter_frontend_and_ir/overview_of_frontend.md) - - [中间表示](chapter_frontend_and_ir/intermediate_representation.md) - - [自动微分](chapter_frontend_and_ir/ad.md) - - [类型系统和静态分析](chapter_frontend_and_ir/type_system_and_static_analysis.md) - - [常见前端编译优化方法](chapter_frontend_and_ir/common_frontend_optimization_pass.md) - - [总结](chapter_frontend_and_ir/summary.md) -- [编译器后端和运行时](chapter_backend_and_runtime/index.md) - - [概述](chapter_backend_and_runtime/overview.md) - - [计算图优化](chapter_backend_and_runtime/graph_optimizer.md) - - [算子选择](chapter_backend_and_runtime/kernel_selecter.md) - - [内存分配](chapter_backend_and_runtime/memory_allocator.md) - - [计算调度与执行](chapter_backend_and_runtime/compute_schedule_and_execute.md) - - [算子编译器](chapter_backend_and_runtime/op_compiler.md) - - [总结](chapter_backend_and_runtime/summary.md) -- [硬件加速器](chapter_accelerator/index.md) - - [概述](chapter_accelerator/accelerator_introduction.md) - - [加速器基本组成原理](chapter_accelerator/accelerator_architecture.md) - - [加速器基本编程原理](chapter_accelerator/accelerator_programming.md) - - [加速器实践](chapter_accelerator/accelerator_practise.md) - - [总结](chapter_accelerator/summary.md) -- [数据处理框架](chapter_data_processing/index.md) - - [概述](chapter_data_processing/requirements.md) - - [易用性设计](chapter_data_processing/program_model.md) - - [高效性设计](chapter_data_processing/performance.md) - - [保序性设计](chapter_data_processing/data_order.md) - - [单机数据处理性能的扩展](chapter_data_processing/extension.md) - - [总结](chapter_data_processing/summary.md) -- [模型部署](chapter_model_deployment/index.md) - - [概述](chapter_model_deployment/model_deployment_introduction.md) - - [训练模型到推理模型的转换及优化](chapter_model_deployment/model_converter_and_optimizer.md) - - [模型压缩](chapter_model_deployment/model_compression.md) - - [模型推理](chapter_model_deployment/model_inference.md) - - [模型的安全保护](chapter_model_deployment/model_security.md) - - [总结](chapter_model_deployment/summary.md) -- [分布式训练](chapter_distributed_training/index.md) - - [系统概述](chapter_distributed_training/overview.md) - - [实现方法](chapter_distributed_training/methods.md) - - [机器学习集群架构](chapter_distributed_training/cluster.md) - - [集合通信](chapter_distributed_training/collective.md) - - [参数服务器](chapter_distributed_training/parameter_servers.md) - - [总结](chapter_distributed_training/summary.md) - -# 拓展篇 - -- [导读](chapter_preface_extension/index.md) -- [深度学习推荐系统](chapter_recommender_system/index.md) - - [系统基本组成](chapter_recommender_system/system_architecture.md) - - [多阶段推荐系统](chapter_recommender_system/multi_stage_recommender_system.md) - - [模型更新](chapter_recommender_system/model_update.md) - - [案例分析:支持在线模型更新的大型推荐系统](chapter_recommender_system/case_study.md) - - [小结](chapter_recommender_system/summary.md) -- [联邦学习系统](chapter_federated_learning/index.md) - - [概述](chapter_federated_learning/overview.md) - - [横向联邦学习](chapter_federated_learning/horizontal_fl.md) - - [纵向联邦学习](chapter_federated_learning/vertical_fl.md) - - [隐私加密算法](chapter_federated_learning/privacy_encryption_algorithm.md) - - [展望](chapter_federated_learning/outlook.md) - - [小结](chapter_federated_learning/summary.md) -- [强化学习系统](chapter_reinforcement_learning/index.md) - - [强化学习介绍](chapter_reinforcement_learning/rl_introduction.md) - - [单节点强化学习系统](chapter_reinforcement_learning/single_node_rl.md) - - [多智能体强化学习](chapter_reinforcement_learning/marl.md) - - [多智能体强化学习系统](chapter_reinforcement_learning/marl_sys.md) - - [小结](chapter_reinforcement_learning/summary.md) -- [可解释性AI系统](chapter_explainable_AI/index.md) - - [背景](chapter_explainable_AI/explainable_ai.md) -- [机器人系统](chapter_rl_sys/index.md) - - [机器人系统概述](chapter_rl_sys/rl_sys_intro.md) - - [通用机器人操作系统](chapter_rl_sys/ros.md) - - [案例分析:使用机器人操作系统](chapter_rl_sys/ros_code_ex.md) - - [总结](chapter_rl_sys/summary.md) - -# 附录 - -- [机器学习介绍](appendix_machine_learning_introduction/index.md) - - [神经网络](appendix_machine_learning_introduction/neural_network.md) - - [梯度下降与反向传播](appendix_machine_learning_introduction/gradient_descent.md) - - [经典机器学习方法](appendix_machine_learning_introduction/classic_machine_learning.md) diff --git a/zh_chapters/appendix_machine_learning_introduction/classic_machine_learning.md b/zh_chapters/appendix_machine_learning_introduction/classic_machine_learning.md deleted file mode 100644 index e573e1d..0000000 --- a/zh_chapters/appendix_machine_learning_introduction/classic_machine_learning.md +++ /dev/null @@ -1,72 +0,0 @@ -## 经典机器学习方法 - -大量经典机器学习算法,如 支持向量机(Support Vector Machine,SVM), -K最近邻(K-Nearest Neighbor, KNN)分类算法 和K均值聚类算法(K-Means -Clustering Algorithm)等, -虽然它们有的有网络参数,有的没有网络参数,有的是监督学习算法,有的是无监督学习算法, -训练过程也不一样,但是从系统的角度,它们都是以矩阵运算为基础的。下面,我们来简要介绍一下这些算法。 - -### 支持向量机 - -**支持向量机**(Support Vector -Machine,SVM),是一种经典的机器学习分类算法,其核心思想在于最大化决策边界到数据点的距离。在这里,我们以线性可分数据为例;对于非线性可分的数据,运用**核方法**(Kernel -Method)即可类似处理。 - -如果训练数据是线性可分的,SVM的目标则是最大化**间隔**(Margin)。首先,我们先来定义最大化间隔的分类器,如下: -$$\min_{{w},b} ~~~\frac{1}{2} ||{w}||^2$$ -$$s.t. ~~~y_i ({w}^T {x_i} + b) \geq 1, ~~~\forall 1 \leq i \leq n$$ -其拉格朗日乘子为 -$$L({w},b,{\lambda}) = \frac{1}{2} ||{w}||^2 + \sum_{i=1}^n \lambda_i (1-y_i({w}^T {x_i} + b))$$ -由于$\frac{1}{2} ||{w}||^2$是凸的,并且$\lambda_i (1-y_i({w}^T {x_i} + b))$是线性的(也是凸的),所以优化问题的解为 -$$\max_{\lambda>0} \min_{{w},b} L({w},b, {\lambda})$$ -求$L$关于${w},b$的导数有 -$$\nabla_{{w}} L= {w} - \sum_{i=1}^n \lambda_i y_i {x_i}$$ -$$\nabla_b L = - \sum_{i=1}^n \lambda_i y_i$$ -令$L$关于${w},b$的导数均为0得到,${w}^* = \sum_{i=1}^n \lambda_i y_i {x_i}$以及$\sum_{i=1}^n \lambda_i y_i = 0$。 -由于当$\lambda$固定的时候,$b$的值对目标函数无贡献,所以可以令$b^* = 0$。 -这时,由对偶性理论和KTT条件,我们得到: -$$y_i ({w}^{*T} {x_i} + b^*) > 1 \Rightarrow \lambda_i^* = 0$$ -$$\lambda_i^* > 0 \Rightarrow y_i ({w}^{*T} {x_i} + b^*) = 1$$ -$${w}^* = \sum_{i=1}^n \lambda_i^* y_i {x_i}$$ -如果$y_i ({w}^{*T} {x_i} + b^*) = 1$,那么${x_i}$就是离超平面$({w}^*,b^*)$最近的点之一,否则就不是。因此,${w}^*$就是离超平面$({w}^*,b^*)$最近的点${x_i}$的线性组合。 - -如此,通过SVM算法,我们实现了数据的分类,并且能够最大化了决策边界到最近点的距离。 -我们定义满足$y_i ({w}^{*T} {x_i} + b^*) = 1$的${x_i}$为**支持向量**(Support -Vectors),同时把分类器$\hat{y}=sgn({w}^{*T} {x_i} + b^*)$称为支持向量机。 - -### K最近邻算法 - -**K最近邻算法**(K-Nearest -Neighbor,KNN)也是一种传统的机器学习算法,可用于分类、回归等基本的机器学习任务。和上面介绍的SVM算法不同,K最近邻算法的核心思想并不是用一个决策边界把属于不同类的数据分开,而是依靠每个数据点周围几个距离最近的数据的性质,来预测数据点本身的性质。 - -KNN用于分类时,为了预测某个样本点的类别,会进行一次投票。投票的对象为离这个观测样本点最近的K个样本点,每个要投票的样本点可能会被赋予不同的权重,而投票的"内容"则是样本点的类别。处理投票结果的时候,采用的是少数服从多数的决策方法(Majority -Vote)。也就是说,若一个样本点最近的K个样本点中大多数属于某个类别,那么该样本点也属于这个类别。 - -KNN算法的具体描述如下:(1)计算待分类点到各已知类别点的距离;(2)将这些点按照距离排序,并按照距离挑选出最近的K个点;(3)按照每个点的权重进行"统票",票面内容为点所处的类别;(4)返回得票最高的类别,并作为待分类点的预测类别。 - -KNN算法有几个需要注意的关键问题,包括超参数K的选择,距离的度量方式,还有分类决策规则。对于超参数K,不宜过大,否则会导致很大的近似误差,反之亦不宜过小,否则会导致很大的估计误差。距离的度量,则可以选择曼哈顿距离、欧式距离和闵可夫斯基距离等等。为了降低K值对于预测结果产生的误差和影响,我们通常可以对分类决策规则做一定的规定,比如在投票决策时让距离小的点有更大的权重,距离较大的点权重较小。在编程实现KNN算法的时候,权重等参数都会以矩阵的形式进行运算,以提高运算效率。 - -### K均值聚类算法 - -**K均值聚类算法**(K-Means Clustering -Algorithm)是机器学习中一种常见的无监督聚类算法。在这里,我们首先定义聚类问题:给定数据点${x_1},\cdots, {x_n} \in \mathbb{R}^d$和$K\in \mathbb{N}$,需要划分为$K$个簇${C_1}, \cdots, {C_K} \in \mathbb{R}^d$以及每个数据点所对应的分类中心点${ C_{(1)}}, \cdots, {C_{(n)}}$,以最小化距离和$\sum_i ||{x_i} - {C_{(i)}}||^2$。 - -K均值聚类算法是一种解决聚类问题的算法,算法过程如下: - -- 随机选择${C_1}, \cdots, {C_K}$ - -- 把${x_i}$所对应的分类置为距离其最近的聚类中心点的分类 - -- 计算并赋值${C_K} = \frac{\sum_{{C_{(i)}}={C_K}} {x_i}}{\sum_{{C_{(i)}}={C_K}} 1}$ - -- 重复以上步骤直到算法收敛 - -可以证明,K均值聚类算法会使得距离和$\sum_i ||{x_i} - {C_{(i)}}||^2$不断地单调减小,并且最终能够收敛。不过,算法可能收敛到局部最小值。 - -本章结束语: - -在系统角度,机器学习的算法无论是什么算法,涉及到高维数据任务的现都是矩阵运算实现的。 - -## 参考文献 - -:bibliography:`../references/appendix.bib` \ No newline at end of file diff --git a/zh_chapters/appendix_machine_learning_introduction/gradient_descent.md b/zh_chapters/appendix_machine_learning_introduction/gradient_descent.md deleted file mode 100644 index e7db43c..0000000 --- a/zh_chapters/appendix_machine_learning_introduction/gradient_descent.md +++ /dev/null @@ -1,93 +0,0 @@ -## 梯度下降与反向传播 - -上面大体上介绍了经典神经网络的内容,那么现在有一个问题,这些网络中的参数是如何确定的呢?如果要解决的问题是一个小感知器就能解决的话,参数可以人为地去确定。但是如果是一个深度网络的话,参数的确定需要自动化,也就是所谓的网络训练,而这个过程需要我们设定一个**损失函数**(Loss -Function)来作为训练优化的一个方向。 -常见的损失函数有:1)用来衡量向量之间距离的均方误差(Mean Squared -Error,MSE) -$\mathcal{L} = \frac{1}{N}\|{y}-\hat{{y}}\|^{2}_{2} = \frac{1}{N}\sum_{i=1}^N(y_{i}-\hat{y}_{i})^{2}$ -和 平均绝对误差(Mean Absolute Error,MAE) -$\mathcal{L} = \frac{1}{N}\sum_{i=1}^{N}|y_{i}-\hat{y}_{i}|$ -,其中$N$代表数据样本的数量,用以求平均用,而$y$代表真实标签(Ground -Truth)、$\hat{y}$代表网络输出的预测标签。 -2)分类任务可以用的交叉熵损失(Cross Entropy) -$\mathcal{L} = - \frac{1}{N} \sum_{i=1}^N \bigg(y_{i}\log\hat{y}_{i} + (1 - y_{i})\log(1 - \hat{y}_{i})\bigg)$来作为损失数,当且仅当输出标签和预测标签一样的时候损失值才为零。 - -有了损失值之后,我们就可以利用大量真实标签的数据和优化方法来更新模型参数了,其中最常用的方法是**梯度下降**(Gradient -Descent)。如 :numref:`gradient_descent2`所示, -开始的时候,模型的参数${w}$是随机选取的,然后求出损失值对参数的偏导数$\frac{\partial \mathcal{L}}{\partial {w}}$,通过反复迭代 -${w}:={w}-\alpha\frac{\partial \mathcal{L}}{\partial {w}}$完成优化。这个优化的过程其实就可以降低损失值以达到任务目标,其中$\alpha$是控制优化幅度的**学习率**(Learning -Rate)。 -在实践中,梯度下降最终得到的最小值很大可能是一个局部最小值,而不是全局最小值。不过由于深度神经网络能提供一个很强的数据表达能力,所以局部最小值可以很接近全局最小值,损失值可以足够小。 - -![梯度下降介绍。(左图)只有一个可以训练的参数$w$;(右图)有两个可以训练的参数${w}=[w_1,w_2]$。在不断更新迭代参数后,损失值$\mathcal{L}$会逐渐地减小。但是由于存在很多局部最优解,我们往往不能更新到全局最优解。](../img/ch_basic/gradient_descent2.png) -:width:`600px` -:label:`gradient_descent2` - -那么接下来,在深度神经网络中如何实现梯度下降呢,这需要计算出网络中每层参数的偏导数$\frac{\partial \mathcal{L}}{\partial {w}}$,我们可以用**反向传播**(Back-Propagation) :cite:`rumelhart1986learning,lecun2015deep`来实现。 -接下来, -我们引入一个中间量${\delta}=\frac{\partial \mathcal{L}}{\partial {z}}$来表示损失函数$\mathcal{L}$ -对于神经网络输出${z}$(未经过激活函数,不是$a$)的偏导数, -并最终得到$\frac{\partial \mathcal{L}}{\partial {w}}$。 - -我们下面用一个例子来介绍反向传播算法, -我们设层序号为$l=1, 2, \ldots L$(输出层(最后一层)序号为$L$)。 -对于每个网络层,我们有输出${z}^l$,中间值${\delta}^l=\frac{\partial \mathcal{L}}{\partial {z}^l}$和一个激活值输出${a}^l=f({z}^l)$ -(其中$f$为激活函数)。 -我们假设模型是使用Sigmoid激活函数的多层感知器,损失函数是均方误差(MSE)。也就是说,我们设定: - -- 网络结构${z}^{l}={W}^{l}{a}^{l-1}+{b}^{l}$ - -- 激活函数${a}^l=f({z}^l)=\frac{1}{1+{\rm e}^{-{z}^l}}$ - -- 损失函数$\mathcal{L}=\frac{1}{2}\|{y}-{a}^{L}\|^2_2$ - -我们可以直接算出激活输出对于原输出的偏导数: - -- $\frac{\partial {a}^l}{\partial {z}^l}=f'({z}^l)=f({z}^l)(1-f({z}^l))={a}^l(1-{a}^l)$ - -和损失函数对于激活输出的偏导数: - -- $\frac{\partial \mathcal{L}}{\partial {a}^{L}}=({a}^{L}-{y})$ - -有了这些后,为了进一步得到损失函数对于每一个参数的偏导数,可以使用**链式法则**(Chain -Rule),细节如下: - -首先,从输出层($l=L$,最后一层)开始向后方传播误差,根据链式法则,我们先计算输出层的中间量: - -- ${\delta}^{L} - =\frac{\partial \mathcal{L}}{\partial {z}^{L}} - =\frac{\partial \mathcal{L}}{\partial {a}^{L}}\frac{\partial {a}^L}{\partial {z}^{L}}=({a}^L-{y})\odot({a}^L(1-{a}^L))$ - -除了输出层($l=L$)的中间值${\delta}^{L}$,其他层($l=1, 2, \ldots , L-1$)的中间值${\delta}^{l}$如何计算呢? - -- 已知模型结构${z}^{l+1}={W}^{l+1}{a}^{l}+{b}^{l+1}$,我们可以直接得到$\frac{\partial {z}^{l+1}}{\partial {a}^{l}}={W}^{l+1}$;而且我们已知$\frac{\partial {a}^l}{\partial {z}^l}={a}^l(1-{a}^l)$ - -- 那么根据链式法则,我们可以得到 ${\delta}^{l} - =\frac{\partial \mathcal{L}}{\partial {z}^{l}} - =\frac{\partial \mathcal{L}}{\partial {z}^{l+1}}\frac{\partial {z}^{l+1}}{\partial {a}^{l}}\frac{\partial {a}^{l}}{\partial {z}^{l}} - =({W}^{l+1})^\top{\delta}^{l+1}\odot({a}^l(1-{a}^l))$ - -根据上面的计算有所有层的中间值${\delta}^l, l=1, 2, \ldots , L$后,我们就可以在此基础上求出损失函数对于每层参数的偏导数:$\frac{\partial \mathcal{L}}{\partial {W}^l}$和$\frac{\partial \mathcal{L}}{\partial {b}^l}$,以此来根据梯度下降的方法来更新每一层的参数。 - -- 已知模型结构${z}^l={W}^l{a}^{l-1}+{b}^l$,我们可以求出 - $\frac{\partial {z}^{l}}{\partial {W}^l}={a}^{l-1}$ 和 - $\frac{\partial {z}^{l}}{\partial {b}^l}=1$ - -- 那么根据链式法则,我们可以得到$\frac{\partial \mathcal{L}}{\partial {W}^l}=\frac{\partial \mathcal{L}}{\partial {z}^l}\frac{\partial {z}^l}{\partial {W}^l}={\delta}^l({a}^{l-1})^\top$ - , - $\frac{\partial \mathcal{L}}{\partial {b}^l}=\frac{\partial \mathcal{L}}{\partial {z}^l}\frac{\partial {z}^l}{\partial {b}^l}={\delta}^l$ - -求得所有偏导数$\frac{\partial \mathcal{L}}{\partial {W}^l}$ 和 -$\frac{\partial \mathcal{L}}{\partial {b}^l}$后,我们就可以用梯度下降更新所有参数${W}^l$ -和 ${b}^l$: - -- ${W}^l:={W}^l-\alpha\frac{\partial \mathcal{L}}{\partial {W}^l}$, - ${b}^l:={b}^l-\alpha\frac{\partial \mathcal{L}}{\partial {b}^l}$ - -但是还有一个问题需要解决,那就是梯度下降的时候每更新一次参数,都需要计算一次当前参数下的损失值。然而,当训练数据集很大时($N$很大),若每次更新都用整个训练集来计算损失值的话,计算量会非常巨大。 -为了减少计算量,我们使用**随机梯度下降**(Stochastic Gradient -Descent,SGD)来计算损失值。具体来说,我们计算损失值不用全部训练数据,而是从训练集中随机选取一些数据样本来计算损失值,比如选取16、32、64或者128个数据样本,样本的数量被称为**批大小**(Batch -Size)。 -此外,学习率的设定也非常重要。如果学习率太大,可能无法接近最小值的山谷,如果太小,训练又太慢。 -自适应学习率,例如Adam :cite:`KingmaAdam2014`、RMSProp :cite:`tieleman2012rmsprop`和 -Adagrad :cite:`duchi2011adagrad`等,在训练的过程中通过自动的方法来修改学习率,实现训练的快速收敛,到达最小值点。 diff --git a/zh_chapters/appendix_machine_learning_introduction/index.md b/zh_chapters/appendix_machine_learning_introduction/index.md deleted file mode 100644 index 680737b..0000000 --- a/zh_chapters/appendix_machine_learning_introduction/index.md +++ /dev/null @@ -1,12 +0,0 @@ -# 附录:机器学习介绍 - -本书假设读者有一定的机器学习算法基础,因此本章只会简略地介绍一下机器学习,其中的梯度下降方法对本书机器学习系统来说尤为重要,是必须掌握的内容。 - -```toc -:maxdepth: 2 -:numbered: - -neural_network -gradient_descent -classic_machine_learning -``` \ No newline at end of file diff --git a/zh_chapters/appendix_machine_learning_introduction/neural_network.md b/zh_chapters/appendix_machine_learning_introduction/neural_network.md deleted file mode 100644 index f9ef31c..0000000 --- a/zh_chapters/appendix_machine_learning_introduction/neural_network.md +++ /dev/null @@ -1,175 +0,0 @@ -## 神经网络 - -### 感知器 - -:width:`600px` -:label:`single_neuron` - - :numref:`single_neuron`是一个神经元的例子,输入数据$x$根据连线上的权重$w$做加权求和得到输出$z$,我们把这样的模型叫作**感知器**(Perceptron)。 - 因为输入和输出之间只有一层神经连接,这个模型也叫做单层感知器。 :numref:`single_neuron`的模型计算可以写为:$z = w_{1}x_{1}+ w_{2}x_{2} + w_{3}x_{3}$。 - -当输入数据用列向量${x}=[x_1,x_2,x_3]^T$表示,模型权重用行向量${w}=[w_1,w_2,w_3]$表示,那么输出的标量$z$可以写为: - -$$z = -\begin{bmatrix} -w_1,w_2,w_3\\ -\end{bmatrix} -\begin{bmatrix} -x_1\\ -x_2\\ -x_3 -\end{bmatrix} -={w}{x}$$ - -我们可以利用输出标量$z$为输入的加权组合来实现特定任务。 -比如,可以对"好苹果"和"坏苹果"进行分类,输入的$x_1,x_2,x_3$分别代表三种不同的特征:1)红色的程度,2)有没有洞,3)大小。如果苹果的大小对这个判断没有影响,那么对应的权重就为零。 -这个神经网络的训练,其实就是选择合适的权重,来实现我们的任务。比如我们可以选择合适的权重,使得当$z$小于等于$0$时代表"坏苹果",而当$z$大于$0$时则是"好苹果"。 -则最终的分类输出标签$y$如下,为$1$时代表好,$0$代表坏。这个神经元的输入和输出之间只有一层,所以可以成为单层神经网络。 - -$$ -y = -\begin{cases} -1 & z>0 \\ -0 & z \leq 0 \\ -\end{cases}$$ - -### 决策边界vs.偏置 - -通过选择合适的权重以$z$大于或小于$0$来对输入数据做分类的话,可以在数据空间上获得一个**决策边界** -(Decision Boundary)。如 :numref:`single_neuron_decision_boundary2`所示,以神经元输出$z=0$作为输出标签$y$的决策边界, -没有偏置时决策边界必然经过坐标原点,如果数据样本点不以原点来分开,会导致分类错误。 -为了解决这个问题,可以在神经元上加入一个**偏置**(Bias)。 :numref:`single_neuron_bias2` -是一个有偏置$b$的神经元模型,可以用 :eqref:`singleneuron_bias`表达: -$$z = w_{1}x_{1}+ w_{2}x_{2}+ w_{3}x_{3} + b$$ -:eqlabel:`singleneuron_bias` - - -:width:`600px` -:label:`single_neuron_decision_boundary2` - - -:width:`600px` -:label:`single_neuron_bias2` - -有了偏置以后,决策边界(直线、平面或超平面)可以不经过坐标原点,因此能更好地分类样本。 -准确来说,决策边界把这些样本数据分成两个不同的类别,这个边界是 -$\{x_1, x_2, x_3 | w_{1}x_{1}+ w_{2}x_{2}+ w_{3}x_{3} + b = 0\}$。 - -### 逻辑回归 - -上述神经元的输入和输出是线性关系,为了提供非线性的数据表达能力,可以在神经元输出上加上**激活函数**(Activation -Function),最常见的激活函数有Sigmoid、Tanh、ReLU和Softmax等。 -比如,上述神经元以$z=0$为分界来做分类任务,那么我们可不可以让神经元输出一个概率呢?比如输出$0~1$,$1$代表输入数据$100\%$为某一类。 -为了让神经元输出$0~1$,可以在$z$上加一个逻辑函数**Sigmoid**, -如 :eqref:`sigmoid`所示,Sigmoid把数值限制在0和1之中,通过一个简单的临界值(如:0.5)来决定最终输出的标签是否属于某个类别。这个方法叫做**逻辑回归**(Logistic -Regression)。 - -$$a = f({z}) = \frac{1}{1+{\rm e}^{-{z}}}$$ -:eqlabel:`sigmoid` - -### 多个神经元 - - -:width:`600px` -:label:`two_neurons2` - -上述网络只有一个输出,若多个神经元在一起就可以有多个输出。 :numref:`two_neurons2`是有两个输出的网络,每个输出都和所有输入相连,所以也被称**全连接层**(Fully-Connected(FC) Layer), -可由下述式子 :eqref:`fc_cal`表示X。 - -$$z_{1} &= w_{11}x_{1} + w_{12}x_{2} + w_{13}x_{3} + b_1 \notag \\ z_{2} &= w_{21}x_{1} + w_{22}x_{2} + w_{23}x_{3} + b_2$$ -:eqlabel:`fc_cal` - -如下式子表示了矩阵方法的实现: - -$$ -{z} = -\begin{bmatrix} -z_1 \\ -z_2 -\end{bmatrix} -= -\begin{bmatrix} -w_{11} & w_{12} & w_{13}\\ -w_{21} & w_{22} & w_{23}\\ -\end{bmatrix} -\begin{bmatrix} -x_1\\ -x_2\\ -x_3 -\end{bmatrix} -+ -\begin{bmatrix} -b_1 \\ b_2 -\end{bmatrix} -= {W}{x} + {b}$$ - - -多输出的网络可以实现多分类问题,比如有10个数值输出,每个数值分别代表一类物品的概率,每个输出在$0$到$1$之间,10个输出之和为$1$。 -可用 :eqref:`e_softmax`的**Softmax** 函数来实现,$K$为输出的个数: - -$$f({z})_{i} = \frac{{\rm e}^{z_{i}}}{\sum_{k=1}^{K}{\rm e}^{z_{k}}}$$ -:eqlabel:`e_softmax` - -### 多层感知器 - - - -**多层感知器**(Multi-Layer -Perceptron,MLP) :cite:`rosenblatt1958perceptron`通过叠加多层全连接层来提升网络的表达能力。相比单层网络,多层感知器有很多中间层的输出并不暴露给最终输出,这些层被称为**隐含层**(Hidden -Layers)。这个例子中的网络可以通过下方的串联式矩阵运算实现,其中$W^l$和$b^l$代表不同层的权重矩阵和偏置,$l$代表层号,$L$代表输出层。 - -$${z} = f({W^L}f({W^3}f({W^2}f({W^1}{x} + {b^1}) + {b^2}) + {b^3}) + {b^L})$$ - -在深度学习时代,网络模型基本都是多层的神经网络层连接起来的,输入数据经过多层的特征提取,可以学到不同抽象层级的**特征向量**(Feature -Vector)。下面我们介绍一下其他常用的神经网络层。 - -### 卷积网络 - - -:width:`600px` -:label:`conv_computation_v4` - -**卷积神经网络** (Convolutional Neural -Network,CNN) :cite:`lecun1989backpropagation`由多层**卷积层**(Convolutional -Layer)组成,常用于计算机视觉任务 :cite:`krizhevsky2012imagenet,he2016deep`。 - :numref:`conv_computation_v4`描述了一个卷积运算的例子。 -根据卷积的特点,我们可以知道两个事实:1)一个卷积核的通道数,等于输入的通道数;2)输出的通道数,等于卷积核的数量。 - - :numref:`conv_computation_v4`例子中,卷积核每次滑动一个数值的范围来进行卷积操作,我们称它的**步长**(Stride)为1。此外,如果希望输入的边缘数值也能被考虑在内的话,则需要对边缘做**填零**(Zero -Padding)操作。 :numref:`conv_computation_v4`例子中,如果输入的每个通道上下左右都填充一圈零,那么输出的大小则为$4\times 4\times 1$。填零的圈数取决于卷积核的大小,卷积核越大则填零圈数越大。 - -为了对输入的图像数据做特征提取,卷积核数量往往比输入数据的通道数据要多,这样的话输出数据的数值会很多,计算量变大。然而图像数据中相邻像素的特征往往相似,所以我们可以对相邻的输出特征进行聚合操作。**池化层**就是为了实现这个目的,我们通常有两种池化方法最大值池化(Max -Pooling)和平均值池化(Mean -Pooling)。如 :numref:`pooling_v3`所示,假设池化的卷积核高宽为$2\times2$,输入$4\times4$的数据,步长为2(步长为1时,则输出等于输入),则输出为$2\times2$。 - - -:width:`600px` -:label:`pooling_v3` - -卷积层和全连接层都是很常用的,但是卷积层在输入是高维度的图像时,需要的参数量远远小于全连接层。卷积层的运算和全连接层是类似的,前者基于高维度张量运算,后者基于二维矩阵运算。 - -### 时序模型 - -现实生活中除了图像还有大量时间序列数据,例如视频、股票价格等等。**循环神经网络**(Recurrent -Neural Networks,RNN) :cite:`rumelhart1986learning`是一种处理序列数据的深度学习模型结构。序列数据是一串连续的数据$\{x_1, x_2, \dots, x_n\}$,比如每个$x$代表一个句子中的单词。 - -为了可以接收一连串的输入序列,如 :numref:`rnn_simple_cell2`所示,朴素循环神经网络使用了循环单元(Cell)作为计算单元,用隐状态(Hidden -State)来存储过去输入的信息。具体来说,对输入模型的每个数据$x$,根据公式 :eqref:`aligned`,循环单元会反复计算新的隐状态,用于记录当前和过去输入的信息。而新的隐状态会被用到下一单元的计算中。 - -$${h}_t = {W}[{x}_t; {h}_{t-1}] + {b}$$ -:eqlabel:`aligned` - - -:width:`600px` -:label:`rnn_simple_cell2` - -然而这种简单的朴素循环神经网络有严重的信息遗忘问题。比如说我们的输入是"我是中国人,我的母语是___",隐状态记住了"中国人"的信息,使得网络最后可以预测出"中文"一词;但是如果句子很长的时候,隐状态可能记不住太久之前的信息了,比如说"我是中国人,我去英国读书,后来在法国工作,我的母语是___",这时候在最后的隐状态中关于"中国人"的信息可能会被因为多次的更新而遗忘了。 -为了解决这个问题,后面有人提出了各种各样的改进方法,其中最有名的是长短期记忆(Long -Short-Term Memory,LSTM) :cite:`Hochreiter1997lstm`。关于时序的模型还有很多很多,比如近年来出现的Transformer :cite:`vaswani2017attention`等等。 diff --git a/zh_chapters/chapter_accelerator/accelerator_architecture.md b/zh_chapters/chapter_accelerator/accelerator_architecture.md deleted file mode 100644 index dfdf338..0000000 --- a/zh_chapters/chapter_accelerator/accelerator_architecture.md +++ /dev/null @@ -1,86 +0,0 @@ -## 加速器基本组成原理 - -上节主要介绍了加速器的意义以及设计思路,讲述了加速器与通用处理器在设计上的区别,可以看到加速器的硬件结构与CPU的硬件结构有着根本的不同,通常都是由多种片上缓存以及多种运算单元组成。本章节主要以GPU的Volta架构作为样例进行介绍。 - -### 硬件加速器的架构 - -现代GPU在十分有限的面积上实现了极强的计算能力和极高的储存器以及IO带宽。在一块高端的GPU中,晶体管数量已经达到主流CPU的两倍,而且显存已经达到了16GB以上,工作频率也达到了1GHz。GPU的体系架构由两部分组成,分别是流处理阵列和存储器系统,两部分通过一个片上互联网络连接。流处理器阵列和存储器系统都可以单独扩展,规格可以根据产品的市场定位单独裁剪。如GV100的组成 :cite:`2017NVIDIA`如 :numref:`gv100`所示: - - -:width:`800px` -:label:`gv100` - -- 6个GPU处理集群(GPU Processing Cluster,GPC), 每个GPC含有: - - 7个纹理处理集群(Texture Processing Cluster, TPC) (每个TPC含有两个流多处理器(Streaming Multiprocessor, SM)) - - 14个SM -- 84个SM, 每个流多处理器含有: - - 64个32位浮点运算单元 - - 64个32位整数运算单元 - - 32个64位浮点运算单元 - - 8个张量计算核心 - - 4个纹理单元 -- 8个512位内存控制器 - -一个完整的GV100 GPU含有84个SM,5376个32位浮点运算单元,5376个32位整型运算单元,2688个64位浮点运算单元,672个张量运算单元和336个纹理单元。一对内存控制器控制一个HBM2 DRAM堆栈。 :numref:`gv100`中展示的为带有84个SM的GV100 GPU(不同的厂商可以使用不同的配置),Tesla V100则含有80个SM。 - -### 硬件加速器的存储单元 - -与传统的CPU模型相似,从一个计算机系统主内存DRAM中获取数据的速度相对于处理器的运算速度较慢。对于加速器而言,如果没有缓存进行快速存取,DRAM的带宽非常不足。如果无法快速地在DRAM上获取程序和数据,加速器将因空置而降低利用率。为了缓解DRAM的带宽问题,GPU提供了不同层次的若干区域供程序员存放数据,每块区域的内存都有自己的最大带宽以及延迟。开发者需根据不同存储器之间的存储速度的数量级的变化规律,选用适当类型的内存以及最大化地利用它们,从而发挥硬件的最大算力,减少计算时间。 - -- **寄存器文件(Register File)**:片上最快的存储器,但与CPU不同,GPU的每个SM(流多处理器)有上万个寄存器。尽管如此当每个线程使用过多的寄存器时,SM中能够调度的线程块数量就会受到限制,可执行的线程总数量会因此受到限制,可执行的线程数量过少会造成硬件无法充分的利用,性能急剧下降。所以要根据算法的需求合理使用寄存器。 - -- **共享内存(Shared Memory)**:共享内存实际上是用户可控的一级缓存,每个SM(流多处理器)中有128KB的一级缓存, 开发者可根据应用程序需要配置最大96KB的一级缓存作为共享内存。共享内存的访存延迟极低,只有几十个时钟周期。共享内存具有高达1.5TB/s的带宽,远远高于全局内存的峰值带宽900GB/s。共享内存的使用对于高性能计算工程师来说是一个必须要掌握的概念。 - -- **全局内存(Global Memory)**:全局内存之所以称为全局,是因为GPU与CPU都可以对它进行读写操作。全局内存对于GPU中的每个线程都是可见的,都可以直接对全局内存进行读写操作。CPU等其他设备可以通过PCI-E总线对其进行读写操作。全局内存也是GPU中容量最大的一块内存,可达16GB之多。同时也是延迟最大的内存,通常有高达上百个时钟周期的访存延迟。 - -- **常量内存(Constant Memory)**:常量内存其实只是全局内存的一种虚拟地址形式,并没有真正的物理硬件内存块。常量内存有两个特性,一个是高速缓存,另一个更重要的特性是它支持将某个单个值广播到线程束中的每个线程中。 - -- **纹理内存(Texture Memory)**:纹理内存是全局内存的一个特殊形态。当全局内存被绑定为纹理内存时,执行读写操作将通过专用的纹理缓存来加速。在早期的GPU上没有缓存,因此每个SM上的纹理内存为设备提供了唯一真正缓存数据的方法。然而随着硬件的升级,一级缓存和二级缓存的出现使得纹理缓存的这项优势已经荡然无存。纹理内存的另外一个特性,也是最有用的特性就是当访问存储单元时,允许GPU实现硬件相关的操作。比如说使用纹理内存,可以通过归一化的地址对数组进行访问,获取的数据可以通过硬件进行自动插值,从而达到快速处理数据的目的。此外对于二维数组和三维数组,支持硬件级的双线性插值与三线性插值。纹理内存另一个实用的特性是可以根据数组的索引自动处理边界条件,不需要对特殊边缘进行处理即可完成数组内元素操作,从而防止线程中分支的产生。 - - -### 硬件加速器的计算单元 -:label:`compute-unit-title` - -为了支持不同的神经网络模型,加速器会提供以下几种计算单元,不同的网络层可以根据需要选择使用合适的计算单元,如 :numref:`compute-unit`所示 - -- **标量计算单元**:与标准的精简指令运算集(Reduced Instruction Set Computer,RISC)相似,一次计算一个标量元素。 - -- **一维向量计算单元**:一次可以完成多个元素的计算,与传统的CPU和GPU架构中单指令多数据(SIMD)相似,已广泛应用于高性能计算(High Performance Computing,HPC)和信号处理中。 - -- **二维向量计算单元**:一次运算可以完成一个矩阵与向量的内积,或向量的外积。利用数据重复使用这一特性,降低数据通信成本与存储空间,更高效的提高矩阵乘法性能。 - -- **三维向量计算单元**:一次完成一个矩阵的乘法,专为神经网络应用设计的计算单元,更充分利用数据重复特性,隐藏数据通信带宽与数据计算的差距。 - - -:width:`800px` -:label:`compute-unit` - -GPU计算单元主要由标量计算单元和三维向量计算单元组成。如 :numref:`SM`所示,对于每个SM,其中64个32位浮点运算单元、64个32位整数运算单元、32个64位浮点运算单元均为标量计算单元。而8个张量计算核心则是专为神经网络应用设计的三维向量计算单元。 - - -:width:`800px` -:label:`SM` - -张量计算核心每个时钟周期完成一次$4\times4$的矩阵乘累加计算,如 :numref:`tensorcore`所示: - -```cpp - D = A * B + C -``` - - -:width:`800px` -:label:`tensorcore` - -其中A,B,C和D都是$4\times4$的矩阵,矩阵乘累加的输入矩阵A和B是FP16的矩阵,累加矩阵C和D可以是FP16也可以是FP32。 V100的张量计算核心是可编程的矩阵乘法和累加计算单元,可以提供多达125 Tensor TFLOPS(Tera Floating-point Operations Per Second)的训练和推理应用。相比于普通的FP32计算单元可以提速10倍以上。 - -### DSA芯片架构 - -为了满足飞速发展的深度神经网络对芯片算力的需求,业界也纷纷推出了特定领域架构DSA芯片设计。以华为公司昇腾系列AI处理器为例,本质上是一个片上系统(System on Chip,SoC),主要应用在图像、视频、语音、文字处理相关的场景。主要的架构组成部件包括特制的计算单元、大容量的存储单元和相应的控制单元。该芯片由以下几个部分构成:芯片系统控制CPU(Control CPU)、AI计算引擎(包括AI Core和AI CPU)、多层级的片上系统缓存(Cache)或缓冲区(Buffer)、数字视觉预处理模块(Digital Vision Pre-Processing,DVPP)等。 - -昇腾AI芯片的计算核心主要由AI Core构成,负责执行标量、向量和张量相关的计算密集型算子。AI Core采用了达芬奇架构 :cite:`2021Ascend`,基本结构如 :numref:`davinci_architecture`所示,从控制上可以看成是一个相对简化的现代微处理器基本架构。它包括了三种基础计算单元:矩阵计算单元(Cube Unit)、向量计算单元(Vector Unit)和标量计算单元(Scalar Unit)。这三种计算单元分别对应了张量、向量和标量三种常见的计算模式,在实际的计算过程中各司其职,形成了三条独立的执行流水线,在系统软件的统一调度下互相配合达到优化计算效率的目的。 -同GPU类似,在矩阵乘加速设计上,在AICore中也提供了矩阵计算单元作为昇腾AI芯片的核心计算模块,意图高效解决矩阵计算的瓶颈问题。矩阵计算单元提供强大的并行乘加计算能力,可以用一条指令完成两个$16\times16$矩阵的相乘运算,等同于在极短时间内进行了$16\times16\times16=4096$个乘加运算,并且可以实现FP16的运算精度。 - - -:width:`800px` -:label:`davinci_architecture` - diff --git a/zh_chapters/chapter_accelerator/accelerator_introduction.md b/zh_chapters/chapter_accelerator/accelerator_introduction.md deleted file mode 100644 index c242642..0000000 --- a/zh_chapters/chapter_accelerator/accelerator_introduction.md +++ /dev/null @@ -1,17 +0,0 @@ -## 概述 - -### 硬件加速器设计的意义 - -未来人工智能发展的三大核心要素是数据、算法和算力。目前,人工智能系统算力大都构建在CPU和GPU之上且主体多是GPU。随着神经网络的层增多,模型体量增大,算法趋于复杂,CPU和GPU很难再满足新型网络对于算力的需求。例如,2015年谷歌的AlphaGo用了1202个CPU和176个GPU打败了人类职业选手,每盘棋需要消耗上千美元的电费,而与之对应的是人类选手的功耗仅为20瓦。 - -虽然GPU在面向向量、矩阵以及张量的计算上,引入许多新颖的优化设计,但由于GPU需要支持的计算类型复杂,芯片规模大、能耗高,人们开始将更多的精力转移到深度学习硬件加速器的设计上来。和传统CPU和GPU芯片相比,深度学习硬件加速器有更高的性能和更低的能耗。未来随着人们真正进入智能时代,智能应用的普及会越来越广泛,到那时每台服务器、每台智能手机和每个智能摄像头,都需要使用深度学习加速器。 - - -### 硬件加速器设计的思路 -:label:`accelerator-design-title` - -近些年来,计算机体系结构的研究热点之一是深度学习硬件加速器的设计。在体系结构的研究中,能效和通用性是两个重要的衡量指标。其中能效关注单位能耗下基本计算的次数,通用性主要指芯片能够覆盖的任务种类。以两类特殊的芯片为例:一种是较为通用的通用处理器(如CPU),该类芯片理论上可以完成各种计算任务,但是其能效较低大约只有0.1TOPS/W。另一种是专用集成电路(Application Specific Integrated Circuit, ASIC),其能效更高,但是支持的任务相对而言就比较单一。对于通用的处理器而言,为了提升能效,在芯片设计上引入了许多加速技术,例如:超标量技术、单指令多数据(Single Instruction Multiple Data,SIMD)技术以及单指令多线程(Single Instruction Multiple Threads,SIMT)技术等。 - -对于不同的加速器设计方向,业界也有不同的硬件实现。针对架构的通用性,NVIDIA持续在GPU芯片上发力,先后推出了Volta、 Turing、 Ampere等架构,并推出用于加速矩阵计算的张量计算核心(Tensor Core),以满足深度学习海量算力的需求。 - -对于偏定制化的硬件架构,面向深度学习计算任务,业界提出了特定领域架构(Domain Specific Architecture, DSA)。Google公司推出了TPU芯片,专门用于加速深度学习计算任务,其使用脉动阵列(Systolic Array)来优化矩阵乘法和卷积运算,可以充分地利用数据局部性,降低对内存的访问次数。华为也推出了自研昇腾AI处理器,旨在为用户提供更高能效的算力和易用的开发、部署体验,其中的CUBE运算单元,就用于加速矩阵乘法的计算。 diff --git a/zh_chapters/chapter_accelerator/accelerator_practise.md b/zh_chapters/chapter_accelerator/accelerator_practise.md deleted file mode 100644 index b7ea306..0000000 --- a/zh_chapters/chapter_accelerator/accelerator_practise.md +++ /dev/null @@ -1,290 +0,0 @@ -## 加速器实践 - -在本节中会通过具体的CUDA代码向读者介绍如何编写一个并行计算的广义矩阵乘法程序,通过提高计算强度、使用共享内存、优化内存读取流水线等方法最终取得接近硬件加速器性能峰值的实现。虽然在以上章节介绍了张量计算核心相关的内容,但由于篇幅限制,在本节中不使用此硬件结构。而是通过使用更为基本的CUDA代码实现FP32的广义矩阵乘法,来讲解若干实用优化策略。 - -### 环境 - -本节的实践有以下的软件环境依赖: - -* Eigen:Eigen是一个线性代数C++模板库,用户可以只使用几条语句完成多线程线性代数运算。 -* OpenMP(可选):OpenMP是用于共享内存并行系统的多处理器程序设计的一套指导性编译处理方案,可以使用OpenMP对Eigen的计算进行加速。 -* CUDA Toolkit:CUDA Toolkit是英伟达发布的CUDA工具包,其包含了CUDA编译器(NVCC),CUDA线性代数库(cuBLAS)等组件。 -本节的实践都是在CPU Intex Xeon E5-2650 v3,GPU Nvidia Geforce RTX 3080;系统Ubuntu 18.04版本,CUDA Toolkit 11.1进行的。 - -安装相关依赖如下: - -* Eigen:Eigen的安装可以通过使用包管理器安装(如使用指令`apt install libeigen3-dev`),也可以从[官网](https://eigen.tuxfamily.org/index.php?title=Main_Page)下载。 -* OpenMP(可选):通常会被大多数编译器默认支持,如果没有被支持的话可以使用包管理器安装(如使用指令`apt install libomp-dev`)。 -* CUDA Toolkit:CUDA Toolkit的安装建议按照[官方的提示](https://developer.nvidia.com/cuda-downloads)安装,也可以通过使用包管理器安装(如使用指令`apt install cuda`)。 - -### 广义矩阵乘法的朴素实现 - -:label:`sec-accelerator-naive` - -依照算法如 :numref:`gemm-algorith`所示,编写CPU代码如下所示: -```c++ -float A[M][K]; -float B[K][N]; -float C[M][N]; -float alpha, beta; - -for (unsigned m = 0; m < M; ++m) { - for (unsigned n = 0; n < N; ++n) { - float c = 0; - for (unsigned k = 0; k < K; ++k) { - c += A[m][k] * B[k][n]; - } - C[m][n] = alpha * c + beta * C[m][n]; - } -} -``` - -可以看到,矩阵$C$ 中各个元素的计算是独立的。可以利用GPU的大量线程去分别计算矩阵$C$ 中相应的元素,以达到并行计算的目的,GPU核函数将如下所示: - -```c++ -__global__ void gemmKernel(const float * A, - const float * B, float * C, - float alpha, float beta, unsigned M, unsigned N, - unsigned K) { - unsigned int m = threadIdx.x + blockDim.x * blockIdx.x; - unsigned int n = threadIdx.y + blockDim.y * blockIdx.y; - if (m >= M || n >= N) - return; - float c = 0; - for (unsigned k = 0; k < K; ++k) { - c += A[m * K + k] * B[k * N + n]; - } - c = c * alpha; - float result = c; - if (beta != 0) { - result = result + C[m * N + n] * beta; - } - C[m * N + n] = result; -} -``` - -其可视化结构如 :numref:`cuda_naive_gemm`所示,矩阵$C$中每一个元素由一个线程计算,在GPU Kernel的第5和6行计算该线程对应矩阵$C$中的元素行号$m$及列号$n$,然后在第9到11行该线程利用行号与列号读取矩阵$A$和矩阵$B$中相应的行列向量元素并计算向量内积,最后在第17行将结果写回$C$矩阵。 - - -:width:` 800px` -:label:`cuda_naive_gemm` - -使用以下代码启动核函数: - -```c++ -void gemmNaive(const float *A, const float *B, float *C, - float alpha, float beta, unsigned M, - unsigned N, unsigned K) { - dim3 block(16, 16); - dim3 grid((M - 1) / block.x + 1, (N - 1) / block.y + 1); - - gemmKernel<<, $),所以只保留结果矩阵的下三角部分,并将这一部分拉平。拉平后的交叉结果和底层MLP的输出拼接起来,一起作为顶层MLP的输入,顶层MLP的进一步学习后,输出的评分代表用户点击该物品的概率
-
-
-:width:`800px`
-:label:`interaction`
-
-#### 2. 训练方法
-
-DLRM直接基于(用户,物品,标签)对进行训练。模型将用户和物品特征一起输入,进行交互处理预测出用户点击物品的概率。对于正样本应当令概率尽可能接近1,而负样本接近0。
-
-#### 3. 训练评估指标
-
-排序实际上可以被看作一个二分类问题,即将(用户,物品)分类为点击(标签为1)或不点击(标签为0),所以评估排序模型的方法与评估二分类模型类似。但是由于推荐系统数据集通常极度不平衡(正负样本比例悬殊),为了减少数据不平衡对指标的影响,排序模型的常用评估指标为AUC(Area Under Curve, 曲线下面积)和F1评分。
-其中,AUC是ROC(Receiver Operating Characteristic,受试者工作特征)曲线下的面积,ROC曲线是在选取不同分类阈值时的真阳性率-假阳性率曲线。通过计算AUC和ROC曲线,可以选取合适的分类阈值。如果预测概率大于分类阈值,则认为预测结果为1(点击);否则为0(不点击)。根据预测结果可以算出召回率(recall)和精确率(precision),然后根据公式 :eqref:`f1`计算F1评分。
-
-$$
-F1 = 2 \times \frac{recall \times precision}{recall + precision}
-$$
-:eqlabel:`f1`
-
-#### 4. 推理流程
-
-推理时,首先将召回的物品的特征和相应的该用户的特征拼接起来,然后输入DLRM。根据模型的预测分数,选择概率最高的一部分物品输出。
-
-[^1]: 原论文中的用户塔还使用了用户观看过的视频的特征作为种子特征。
-
-[^2]: DLRM允许对模型结构进行定制化,本节以DLRM的默认代码实现为例进行简单介绍。
\ No newline at end of file
diff --git a/zh_chapters/chapter_recommender_system/summary.md b/zh_chapters/chapter_recommender_system/summary.md
deleted file mode 100644
index 9502651..0000000
--- a/zh_chapters/chapter_recommender_system/summary.md
+++ /dev/null
@@ -1,11 +0,0 @@
-## 小结
-
-推荐系统作为深度学习在工业界最成功的落地成果之一,极大地提升了用户的在线使用体验,并且为各大公司创造了可观的利润,从而促使各大公司持续加大对推荐系统的投入。过去两年推荐模型的规模成指数增长,带来了许多系统层面的挑战亟待解决。在实际的生产环境中面临的问题与挑战是本章区区几千字难以概括的,因此工业级推荐系统的架构必然十分复杂,本章只能抛砖引玉地简单介绍一种典型的推荐系统组成的基本架构和运行过程,并介绍了推荐系统面临的持续更新模型的挑战和一种前沿的解决方案。面对实际生产环境,具体的系统设计方案需要根据不同推荐场景的需求而变化,不存在一种万能的解决方案。
-
-## 扩展阅读
-
-- 推荐模型:[Wide & Deep](https://arxiv.org/abs/1606.07792)
-
-- 消息队列介绍:[什么是消息队列](https://aws.amazon.com/message-queue/)
-
-- 特征存储介绍:[什么是机器学习中的特征存储](https://www.featurestore.org/what-is-a-feature-store)
\ No newline at end of file
diff --git a/zh_chapters/chapter_recommender_system/system_architecture.md b/zh_chapters/chapter_recommender_system/system_architecture.md
deleted file mode 100644
index 058c462..0000000
--- a/zh_chapters/chapter_recommender_system/system_architecture.md
+++ /dev/null
@@ -1,68 +0,0 @@
-## 系统基本组成
-
-推荐系统的核心模块是其中的推荐模型,其负责根据输入数据找出用户可能感兴趣的物品。为了支持推荐模型的持续、稳定、高质量运行,大型推荐系统还包括了围绕推荐模型搭建了的一系列其他模块。图 :numref:`ch10-recommendation-systems`展示了一个典型的推荐系统的基本组件。首先有一个消息队列接收从推荐服务的客户端上传的日志,其中包括了用户对于此前推荐结果的反馈,例如用户是否点击了推荐的物品。然后数据处理模块对日志中的原始数据进行处理。处理得到新的训练样本写入另一条消息队列中,由训练服务器读取并更新模型参数。主流的推荐模型主要由两部分构成:嵌入表和神经网络。在训练过程中,训练服务器从参数服务器拉取模型参数,计算梯度并将梯度上传回参数服务器,参数服务器聚合各个训练服务器的结果并更新参数。推理服务器负责处理用户请求,根据用户请求从参数服务器拉取对应的模型参数然后计算推荐结果。
-
-
-:width:`800px`
-:label:`ch10-recommendation-systems`
-
-以下各个小节详细介绍推荐系统工作流中的各个组件的功能和特点。
-
-### 消息队列
-消息队列(Message Queue)是一种服务(Service)间异步通信的方式,常用于无服务(Serverless)或微服务(Microservices)架构中。
-
-例如在推荐系统中,各个模块可以部署成一个个相对独立的微服务。客户端向服务器上报的日志(包含用户对推荐结果的反馈)由消息队列负责收集,然后数据处理服务从消息队列中读取原始日志,进行清洗、转化,得到的用户、物品特征存入特征存储中,而得到的训练样本再写入另一条消息队列中等待训练服务器使用。
-
-消息队列带来的益处非常多,其中之一是允许消息的生产者(Producer),例如客户端的上报组件,和消息的消费者(Consumer),例如服务端的数据处理模块,可以以不同的速率生产消费数据。假设在推荐服务使用的高峰期,用户端产生了大量反馈,如果令数据处理模块直接接受数据,那么很可能因为处理速度跟不上产生速度而导致大量数据被丢弃。即使可以按最高峰的反馈量配置数据处理模块,那么也会导致大部分非高峰期时间资源是浪费的。而消息队列可以在高峰期将用户日志缓存起来,从而使得数据处理模块可以以一个较为恒定且经济的速度处理用户反馈。
-
-作为分布式系统的重要基础组件,业界已经开发了许多成熟的消息队列系统,例如RabbitMQ,Kafka,Pulsar等。限于篇幅和主题,本节无法详细介绍消息队列的各个方面,感兴趣的读者可以参考这些开源系统的文档或者拓展阅读中给出的资料深入学习。
-
-
-### 特征存储
-特征存储是存储并组织特征的地方,被用于模型训练和推理服务中。
-
-前文提到数据处理模块从消息队列中读取原始日志,例如日志中包含用户性别信息可能是“男”“女”,“未知”中的一种。这样的原始特征无法直接输入推荐模型中使用,因此数据处理模块对其进行简单的映射转化:“男” –> 0,“女”-> 1,“未知”-> 2。经过这样转化之后,性别特征就可以被数据处理模块或者推荐模型所使用。转化后的特征被存入特征存储中。一种典型的特征存储格式如图 :numref:`feature-store`所示,当训练或推理模块需要用到用户特征时,只需要知道用户ID就可以从特征存储中查询到所有需要的特征。
-
-
-:width:`800px`
-:label:`feature-store`
-
-使用特征存储的一个显著优势是复用数据处理模块的结果并减少存储冗余,即避免每个模块都要单独对原始数据进行加工处理并维护一个数据存储系统来保存可能会用到的特征。然而其带来的一个更大的益处是可以保证整个系统中的各个组件拥有一致的特征视图。设想一个极端场景,假如训练模块自己维护的数据库中性别“男”对应的值是1,而“女”对应0,而推理模块恰好相反,这样会导致模型推理得到灾难性的结果。
-
-特征存储是机器学习系统中的重要基础组件,工业界有许多成熟的产品,例如SageMaker,Databricks等,也有许多优秀的开源系统,例如Hopsworks,Feast等。关于特征存储更加详细的介绍可以参考拓展阅读中提供的资料。
-
-
-### 稠密神经网络
-稠密神经网络(Dense Neural Network,DNN)是推荐模型的核心,负责探索各个特征之间隐含的联系从而为用户推荐出可能感兴趣的物品。一般在推荐系统中,简单的多层感知机(Multilayer Perceptron,MLP)模型就已经显示出了强大的效果并被应用在谷歌 :cite:`cheng2016wide`、Meta :cite:`naumov2019deep`等各大公司的推荐模型中。虽然MLP的大矩阵相乘操作属于计算密集型任务,对于计算能力要求很高,但是推荐模型中的MLP尺寸一般不超过数MB,对存储要求不高。
-
-虽然MLP已经取得了不错的效果,在推荐系统领域,近年来应用各种新型深度神经网络的尝试从未止步,更加精巧复杂的网络结构层出不穷,近年来也有工作尝试应用Transformer模型完成推荐任务 :cite:`de2021transformers4rec`。在可以预见的未来,推荐模型中的稠密神经网络也必然会增长到数GB乃至TB。
-
-### 嵌入表
-嵌入表是几乎所有推荐模型的共有组件,负责将无法直接参与计算的离散特征数据,例如:用户和物品ID、用户性别、物品类别等,转化为高维空间中的一条向量。推荐模型中的嵌入表的结构和自然语言处理模型中的类似,不同的是自然语言处理模型中的深度神经网络贡献了主要的参数量,而在推荐模型中,如图 :numref:`recommendation-models`所示,嵌入表贡献主要的参数量。这是因为,推荐系统中有大量的离散特征,而每个离散特征的每一种可能的取值都需要有对应的嵌入项。例如,性别特征的取值可能是“女”,“男”,“未知”,则需要三个嵌入项。假设每条嵌入项是一个64维的单精度浮点数向量,如果一个推荐系统服务一亿用户,那么仅仅对应的用户嵌入表(其中的每条嵌入项对应一个用户)的大小就有$4*64*10^8~=23.8$GB。除了用户嵌入表,还有商品嵌入表(其中的每条嵌入项对应一个商品),以及用户和商品的各项特征的嵌入表。总的嵌入表大小可以轻易达到几百GB甚至几十TB。
-而正如上文提到的,推荐系统中通常用的MLP模型尺寸较小。例如一个在Ali-CCP数据集 :cite:`ma2018entire`上训练的DLRM :cite:`naumov2019deep`的嵌入表大小超过1.44GB,而稠密神经网络仅有大约100KB。
-
-
-:width:`800px`
-:label:`recommendation-models`
-
-在推荐系统中,人们通常使用存算分离的参数服务器架构来服务推荐模型。尽管嵌入表占据了推荐模型的主要存储空间,但是其计算却是十分稀疏的。这是因为无论是在训练还是推理过程中,数据都是以小批次的形式依次计算。而在一个批次的计算过程中,只有涉及到的那些嵌入项才会被访问到。假设在一个服务一亿用户的推荐系统每次处理1000条用户的请求,那么一次只有大约十万分之一的嵌入项会被访问到。因此负责计算推荐结果的服务器(训练服务器或者推理服务器)根本没有必要存储所有的嵌入表。
-
-
-### 训练服务器
-因为深度学习推荐系统同时具有存储密集(嵌入表)和计算密集(深度神经网路)的特点,工业界通常使用参数服务器架构来支持超大规模推荐模型的训练和推理。参数服务器架构包含训练服务器、参数服务器和推理服务器。本书 :ref:`parameter_servers`章详细介绍了参数服务器架构,因此本节只重点介绍参数服务器架构具体在推荐系统中的功能。
-
-
-:width:`800px`
-:label:`parameter-server-in-recommendation`
-
-在推荐系统中,训练服务器从消息队列中读取一个批次的数据,然后从参数服务器上拉取对应的嵌入项和深度神经网络,得出推荐结果、计算损失、进行反向传播得到梯度。参数服务器从所有训练服务器处收集梯度,聚合得到新的参数。这就完成了一轮模型训练。
-
-由于参数服务器要聚合所有训练服务器的梯度,为了避免网络延迟导致的掉队者严重影响训练效率,通常一个模型的所有训练服务器位于同一个数据中心中。我们将这个数据中心称之为训练数据中心。
-
-### 参数服务器
-在推荐系统中,参数服务器除了协调训练过程,还要负责支持模型推理。在模型推理过程中,推理服务器需要访问参数服务器上的模型参数以计算推荐结果。因此为了降低推理过程的延迟,通常会在推理服务器所在的数据中心(以下称之为推理数据中心)中的参数服务器上保存至少一份模型参数的副本,结构如图 :numref:`parameter-server-in-recommendation`所示。这种做法还有利于容灾——当一个数据中心因为某些原因被迫下线无法访问时,可以将用户请求重定向至其他的推理数据中心。
-
-### 推理服务器
-推荐系统中的推理服务器负责从客户端接受用户的推荐请求,然后根据请求从参数服务器拉取模型参数,从特征存储中拉取用户和物品特征,然后计算推荐结果。本节为了方便理解,假设用户请求由一个推理服务器处理,实际上在大规模推荐系统中,推理结果由(多个推理服务器上的)多个模型组成的推荐流水线给出。具体的细节将会在下一节多阶段推荐系统中介绍。
-
-[^1]: https://mlcommons.org/en/inference-datacenter-11/
\ No newline at end of file
diff --git a/zh_chapters/chapter_reinforcement_learning/index.md b/zh_chapters/chapter_reinforcement_learning/index.md
deleted file mode 100644
index 318893a..0000000
--- a/zh_chapters/chapter_reinforcement_learning/index.md
+++ /dev/null
@@ -1,19 +0,0 @@
-# 强化学习系统
-
-在本章中,我们介绍深度学习的一个重要分支——强化学习及其在系统方面的知识。本章的学习目标包括:
-
-- 掌握强化学习基本知识。
-
-- 掌握单节点和多节点强化学习系统设计思路。
-
-- 掌握多智能体强化学习基础知识及系统设计简介。
-
-```toc
-:maxdepth: 2
-
-rl_introduction
-single_node_rl
-marl
-marl_sys
-summary
-```
diff --git a/zh_chapters/chapter_reinforcement_learning/marl.md b/zh_chapters/chapter_reinforcement_learning/marl.md
deleted file mode 100644
index d274171..0000000
--- a/zh_chapters/chapter_reinforcement_learning/marl.md
+++ /dev/null
@@ -1,41 +0,0 @@
-## 多智能体强化学习
-
-以上所讲述的强化学习内容都为单智能体强化学习,而在近来的强化学习研究中,多智能体强化学习越来越受到研究人员关注。回想在本小节初介绍的单智能体强化学习框架 :numref:`ch12/ch12-rl-framework`,其中我们只有单个智能体产生的单个动作对环境产生影响,环境也返回单个奖励值给智能体。这里我们把单智能体强化学习扩展到多智能体强化学习,可以得到至少两种可能的多智能体强化学习框架,如 :numref:`ch12/ch12-marl`所示。 :numref:`ch12/ch12-marl`(a)为多智能体同时执行动作的情况,他们相互之间观察不到彼此的动作,他们的动作一同对环境产生影响,并各自接受自己动作所产生的奖励。 :numref:`ch12/ch12-marl`(b)为多智能体顺序执行动作的情况,后续智能体可能观察到前序智能体的动作,他们的动作一同对环境产生影响,并接受到各自的奖励值或共同的奖励值。除此之外,还有许多其他可能的多智能体框架,如更复杂的智能体间观察机制、智能体间通讯机制、多智能体合作与竞争等等。同时,这里假设多个智能体对环境的观察量都为环境的状态,这是最简单的一种,也是现实中最不可能出现的一种,实际情况下的多智能体往往对环境有各自不同的观察量。
-
-:width:`800px`
-
-:label:`ch12/ch12-marl`
-
-这里我们可以根据前面对单智能体强化学习过程的马尔可夫决策过程描述,给出多智能体强化学习的马尔可夫决策过程,它可以用一个数组$(\mathcal{S}, N, \boldsymbol{\mathcal{A}}, \mathbf{R}, \mathcal{T}, \gamma)$来表示。$N$是智能体个数,$\mathcal{S}$和$\boldsymbol{\mathcal{A}}=(\mathcal{A}_1, \mathcal{A}_2, ..., \mathcal{A}_N)$分别是环境状态空间和多智能体动作空间,其中$A_i$是第$i$个智能体的动作空间,$\mathbf{R}=(R_1, R_2, ..., R_N)$是多智能体奖励函数,$\mathbf{R}(s,\mathbf{a})$: $\mathcal{S}\times \boldsymbol{\mathcal{A}}\rightarrow \mathbb{R}^N$为对于当前状态$s\in\mathcal{S}$和当前多智能体动作$\mathbf{a}\in\boldsymbol{\mathcal{A}}$的奖励向量值,其中$R_i$是对第$i$个智能体的奖励值。从当前状态和动作到下一个状态的状态转移概率定义为$\mathcal{T}(s^\prime|s,\mathbf{a})$: $\mathcal{S}\times\boldsymbol{\mathcal{A}}\times\mathcal{S}\rightarrow \mathbb{R}_+$。$\gamma\in(0,1)$是奖励折扣因子(假设多个智能体采用相同的奖励折扣因子)。不同于单智能体强化学习,多智能体强化学习的目标除了常见的最大化每个智能体各自的期望累计奖励值$\mathbb{E}[\sum_t \gamma^t r^i_t], i\in[N]$之外,还有许多其他可能的学习目标,如达到纳什均衡、最大化团队奖励等等。
-
-由上述介绍和定义可以发现,多智能体强化学习是一个比单智能体强化学习更加复杂的问题。而实际上,多个智能体的存在,对于每个智能体的决策而言,绝对不是简单的把每个单智能体决策累加的难度,实际情况要比单智能体决策问题复杂很多。多智能体系统的研究实际上是门古老的学科,它与博弈论(Game Theory)密切相关,在深度强化学习盛行以前早已有大量研究和许多理论上未解的难题。其中一个典型的问题是纳什均衡在双人非零和博弈下没有多项式时间内可解的方法(实际上,这是一个PPAD(Polynomial Parity Argument, Directed version)类的问题。(见论文Settling the Complexity of Computing Two-Player Nash Equilibria. Xi Chen, et al.)由于篇幅限制,我们这里无法对多智能体问题做深入探讨,我们可以用一个简单例子来介绍为什么多智能体强化学习问题无法简单地用单智能体强化学习算法来解。
-
-:剪刀-石头-布的奖励值表
-
-| 奖励值 | 剪刀 | 石头 | 布 |
-| --- | ------- | ------- | ------- |
-| **剪刀** | (0,0) | (-1,+1) | (+1,-1) |
-| **石头** | (+1,-1) | (0,0) | (-1,+1) |
-| **布** | (-1,+1) | (+1,-1) | (0,0) |
-|:label:`tab_ch12_ch12_marl`||||
-
-我们考虑一个大家都熟悉的游戏, 剪刀-石头-布,考虑两个玩家玩这个游戏的输赢情况,我们知道有这样的输赢关系:剪刀<石头<布<剪刀...这里的“<”即前一个纯策略被后一个纯策略完全压制,我们给予奖励值-1、+1到这两个玩家,当他们选择相同的纯策略时,奖励值均为0。于是我们得到一个奖励值表如 :numref:`tab_ch12_ch12_marl`所示,横轴为玩家1,纵轴为玩家2,表内的数组为玩家1和玩家2各自在相应动作下得到的奖励值。
-
-由于这个矩阵的反对称性,这个问题的纳什均衡策略对两个玩家相同,均为$(\frac{1}{3}, \frac{1}{3}, \frac{1}{3})$的策略分布,即有各$\frac{1}{3}$的概率出剪刀、石头或布。如果我们把得到这个纳什均衡策略作为多智能体学习的目标,那么我们可以简单分析得到这个均衡策略无法通过简单的单智能体算法得到。考虑我们随机初始化两个玩家为任意两个纯策略,比如玩家1出剪刀,玩家2出石头。这时假设玩家2策略固定,可以把玩家2看做固定环境的一部分,于是可以使用任意单智能体强化学习算法对玩家1进行训练,使其最大化自己的奖励值。于是,玩家1会收敛到布的纯策略。这时再把玩家1固定,训练玩家2,玩家2又收敛到剪刀的纯策略。于是循环往复,整个训练过程始终无法收敛,玩家1和2各自在3个策略中循环却无法得到正确的纳什均衡策略。
-
-
-
-
-:width:`600px`
-
-:label:`ch12/ch12-marl-sp`
-
-我们在上面这个例子中采用的学习方法其实是多智能体强化学习中最基础的一种,叫自学习(Selfplay),如 :numref:`ch12/ch12-marl-sp`所示。自学习的方法即固定当前玩家 1 的策略,按照单智能体优化的方法最大化一侧智能体的表现,所得策略称为最佳反应策略(Best Response Strategy)。之后再将这一最佳反应策略作为玩家 2 的固定策略,再来优化另一边的智能体策略,如此循环。我们可以看到自学习在特定的任务设置下可能无法收敛到我们想要的最终目标。正是由于多智能体学习过程中有类似循环结构的出现,我们需要更复杂的训练方法,和专门针对多智能体的学习方式来达到我们想要的目标。
-
-一般来讲,多智能体强化学习是比单智能体强化学习更复杂的一类,对于自学习的方法而言,单智能体强化学习的过程可以看做一个多智能体强化学习的子任务。从前面这一小游戏的角度来理解,当玩家 1 策略固定时,玩家 1 加游戏环境构成玩家 2 的实际学习环境,由于这个环境是固定的,玩家 2 可以通过单智能体强化学习来达到自身奖励值最大化;这时再固定玩家 2 的策略,玩家 1 又可以进行单智能体强化学习...... 这样,单智能体强化学习是多智能体任务的子任务。如 :numref:`ch12/ch12-marl-fsp`,其他算法如虚构自学习(Fictitious Self-play),需要在每个单智能体强化学习的步骤中,对对手历史策略的平均策略求得最优应对策略,而对手的训练也是如此,进行循环,能够在上面剪刀-石头-布一类的游戏中保证收敛到纳什均衡策略。
-
-
-
-:width:`600px`
-
-:label:`ch12/ch12-marl-fsp`
\ No newline at end of file
diff --git a/zh_chapters/chapter_reinforcement_learning/marl_sys.md b/zh_chapters/chapter_reinforcement_learning/marl_sys.md
deleted file mode 100644
index 7814445..0000000
--- a/zh_chapters/chapter_reinforcement_learning/marl_sys.md
+++ /dev/null
@@ -1,41 +0,0 @@
-## 多智能体强化学习系统
-
-上述的简单例子只是为了帮助读者理解强化学习在多智能体问题里的角色,而如今前沿的多智能体强化学习算法已经能够解决相当大规模的复杂多智能体问题,如星际争霸(StarCraft II)、Dota 2等游戏,已相继被DeepMind、OpenAI等公司所研究的智能体AlphaStar :cite:`vinyals2019grandmaster`和OpenAI Five :cite:`berner2019dota`攻克,达到超越人类顶级玩家的水平。国内公司如腾讯、启元世界等也提出了星际争霸游戏的多智能体强化学习解决方案TStarBot-X :cite:`han2020tstarbot`和SCC :cite:`wang2021scc`。对于这类高度复杂的游戏环境,整个训练过程对分布式计算系统的要求更高,而整个训练过程可能需要分为多个阶段。以 AlphaStar 为例,它训练的智能体采用了监督学习与强化学习结合的方式。在训练早期,往往先采用大量的人类专业玩家标定数据进行有监督的学习,从而使智能体快速获得较好的能力,随后,训练会切换到强化学习过程,使用前面介绍的虚构自学习的算法进行训练,即自我博弈。为了得到一个表现最好的智能体,算法需要充分探索整个策略空间,从而在训练中不止对一个策略进行训练,而是对一个策略集群(League)进行训练,并通过类似演化算法的方式对策略集群进行筛选,得到大量策略中表现最好的策略。如 :numref:`ch12/ch12-marl_train`所示,在训练过程中每个智能体往往需要
-和其他智能体以及剥削者(Exploiter)进行博弈,剥削者是专门针对某一个智能体策略的最佳对手策略,与之对抗可以提高策略自身的防剥削能力。通过对大量智能体策略进行训练并筛选的这类方法称为集群式训练(Population-based Training/League Training),是一种通过分布式训练提高策略种群多样性进而提升模型表现的方式。可见,在实践中这类方法自然需要分布式系统支持,来实现多个智能体的训练和相互博弈,这很好地体现了多智能体强化学习对分布式计算的依赖性。
-
-
-
-:width:`800px`
-
-:label:`ch12/ch12-marl_train`
-
-我们将对构建多智能体强化学习系统中的困难分为以下几点进行讨论:
-
-* **智能体个数带来的复杂度**:从单智能体系统到多智能体系统最直接的变化,就是智能体个数从1变为大于1个。对于一个各个智能体独立的$N$智能体系统而言,这种变化带来的策略空间表示复杂度是指数增加的,即$\tilde{O}(e^N)$。举个简单的例子,对于一个离散空间的单智能体系统,假设其状态空间大小为$S$, 动作空间大小为$A$,游戏步长为$H$,那么这个离散策略空间的大小为$O(HSA)$;而直接将该游戏扩展为$N$玩家游戏后,在最一般的情况下,即所有玩家有对称的动作空间动作空间大小为$A$且不共享任何结构信息,所有玩家策略的联合分布空间大小为$O(HSA^N)$。这是因为每个独立玩家的策略空间构成联合策略空间是乘积关系$\mathcal{A}=\mathcal{A}_1\times\dots\mathcal{A}_N$。而这将直接导致算法搜索复杂度提升。
-
- 在这种情况下,原先的单智能体系统,需要扩展为对多智能体策略进行优化的系统,这意味着单智能体分布式系统内的每个并行化的模块现在需要相应扩展到多智能体系统中的每个智能体上。而在复杂的情况下,还需要考虑智能体之间通信过程、智能体之间的异质性等,甚至不同智能体可能需要采用不完全对称模型进行表示,以及采用不同的算法进行优化等等。
-
-* **游戏类型带来的复杂度**:从博弈论的角度,多智能系统所产生的游戏类型是复杂的。从最直接的分类角度,有竞争型、合作型、混合型。在竞争型游戏中,最典型的研究模型是二人零和博弈,如前一小节中提到的剪刀-石头-布的游戏。这类游戏中的纳什均衡策略一般为混合型策略,即无法通过单一纯策略达到均衡条件。纯策略纳什均衡存在于少数零和游戏中。合作型游戏即多个智能体需要通过合作来提升整体奖励。在这类问题研究中一般采用基于值分解的思路,将所有智能体得到的奖励值分配到单个智能体作为其奖励值。这一类的算法有VDN :cite:`sunehag2017value`, COMA :cite:`foerster2018counterfactual`, QMIX :cite:`rashid2018qmix`等。
-
- 在混合型游戏中,部分智能体之间为合作关系,部分智能体或智能体的集合间为竞争关系。一般的非零和博弈且非纯合作型游戏为混合型游戏,举个简单的例子如囚徒困境(Prisoner's Dilemma), 其奖励值表如 :numref:`tab_ch12_ch12_marl_prison`所示。囚徒困境的两个玩家各有两个动作,沉默和背叛。可以用警察审查两名罪犯来理解,奖励值的绝对值即他们将被判处的年数。纯所有玩家的奖励值之和非常数,故其为非零和博弈型游戏。因此这一游戏不能被认为是纯竞争型或纯合作型游戏,因为当他们中的一方选择沉默一方选择背叛时,二者没有有效合作,而一方拿到了 0 的奖励,另一方为-3。而两者都选择沉默时是一种合作策略,各自拿到-1 的奖励值。尽管这一策略看起来优于其他策略,但是这并不是这个游戏的纳什均衡策略,因为纳什均衡策略假设玩家间策略需要单独制定,无法形成联合策略分布。这实际上切断了玩家间的信息沟通和潜在合作的可能。因此,囚徒困境的纳什均衡策略是两个玩家都选择背叛对方。
- 诸如此类的博弈论游戏类型,导致单智能体强化学习不能被直接用来优化多智能体系统中的各个智能体的策略。单智能体强化学习一般是找极值的过程,而多智能体系统求解纳什均衡策略往往是找极大-极小值即鞍点的过程,从优化的角度看这也是不同的。复杂的关系需要更普适的系统进行表达,这也对多智能体系统的构建提出了挑战。多智能体游戏类型也有许多其他的分类角度,如单轮进行的游戏、多轮进行的游戏、多智能体同时决策的、多智能体序贯决策等等,每一类不同的游戏都有相应不同的算法。而现有的多智能体系统往往针对单一类型游戏或者单一算法,缺少普适性多智能体强化学习系统,尤其是分布式的系统。
-
-:囚徒困境奖励值
-
-| 奖励值 | 沉默 | 背叛 |
-| --- | ------- | ------- |
-| **沉默** | (-1,-1) | (-3,0) |
-| **背叛** | (0,-3) | (-2,-2) |
-|:label:`tab_ch12_ch12_marl_prison`|||
-
-
-* **算法的异构**:从前面介绍的几个简单的多智能体算法,如自学习、虚构自学习等可以看出,多智能体算法有时由许多轮单智能体强化学习过程组成。而对不同的游戏类型,算法的类型也不相同。比如,对合作型游戏,许多算法是基于功劳分配(Credit Assignment)的思想,如何将多个智能体获得的共同奖励合理分配给单个智能体是这类算法的核心。而这里面按照具体算法执行方式,也可以分为集成训练统一执行的(Centralized Training Centralized Execution)、集成训练分别执行的(Centralized Training Decentralized Execution)、分别训练并分别执行(Decentralized Training Decentralized Execution)的几类,来描述不同智能体训练过程和执行过程的统一性。对于竞争型游戏,往往采用各种计算纳什均衡的近似方法,如前面提到的虚构自学习、Double Oracle、Mirror Descent 等等,将获取单个最优策略的单智能体强化学习过程看做一个“动作”,而对这些“动作”组成的元问题上进行纳什均衡近似。现有的算法在类似问题上有很大的差异性,使得构建一个统一的多智能体强化学习系统比较困难。
-* **学习方法组合**:在前面提到的AlphaStar :cite:`vinyals2019grandmaster`等工作中,多智能体系统中优化得到一个好的策略往往不只需要强化学习算法,还需要其他学习方法如模仿学习等的辅助。比如从一些顶级人类玩家的游戏记录中形成有标签的训练样本,来预训练智能体。由于这些大规模游戏的复杂性,这往往是一个在训练前期快速提升智能体表现的有效方式。而对于整个学习系统而言,这就需要对不同学习范式进行结合,如合理地在模仿学习和强化学习之间进行切换等。这也使得大规模多智能体系统不单一是构建强化学习系统的问题,而需要许多其他学习机制和协调机制的配合实现。
-
-如 :numref:`ch12/ch12_marl_sys`所示,为一个分布式多智能体强化学习系统。图中的两个智能体可以类似扩展到多个智能体。每个智能体包含多个行动者(Actor)用于采样和学习者(Learner)用于更新模型,这些行动者和学习者可以并行处理来加速训练过程,具体方法可以参考单智能体分布式系统章节介绍的A3C和IMPALA架构。训练好的模型被统一存储和管理在模型存储器中,是否对各个智能体的模型统一存储取决于各个智能体是否对称——如果不对称,需要将模型分别存储。存储器中的模型可以被模型评估器用来打分,从而为下一步模型选择器做准备。模型选择器根据模型评估器或者元学习者(如PSRO算法 :cite:`lanctot2017unified`)以及均衡求解器等进行模型选择,并将选出的模型分发到各个智能体的行动者上。这一处理过程,我们称为联盟型管理(League-based Management)。对于与环境交互的部分,分布式系统可以通过一个推理服务器(Inference Server)对各个并行进程中的模型进行集中推理,将基于观察量(Observation)的动作(Action)发送给环境。环境部分也可以是并行的,对推理服务器传递来的动作进行并行处理后,返回观察量。推理服务器将采集到的交互轨迹发送给各个智能体进行模型训练。以上为一个分布式多智能体系统的例子,实际中根据不同的游戏类型和算法结构可能会有不同的设计。
-
-
-
-:width:`800px`
-
-:label:`ch12/ch12_marl_sys`
\ No newline at end of file
diff --git a/zh_chapters/chapter_reinforcement_learning/rl_introduction.md b/zh_chapters/chapter_reinforcement_learning/rl_introduction.md
deleted file mode 100644
index 7199213..0000000
--- a/zh_chapters/chapter_reinforcement_learning/rl_introduction.md
+++ /dev/null
@@ -1,27 +0,0 @@
-## 强化学习介绍
-
-近年来,强化学习作为机器学习的一个分支受到越来越多的关注。2013 年 DeepMind 公司的研究人员提出了深度 Q 学习 :cite:`mnih2013playing`(Deep Q-learning),成功让 AI 从图像中学习玩电子游戏。自此以后,以 DeepMind 为首的科研机构推出了像 AlphaGo 围棋 AI 这类的引人瞩目的强化学习成果,并在 2016 年与世界顶级围棋高手李世石的对战中取得了胜利。自那以后,强化学习领域连续取得了一系列成就,如星际争霸游戏智能体 AlphaStar、Dota 2 游戏智能体 OpenAI Five、多人零和博弈德州扑克的 Pluribus、机器狗运动控制算法等。在这一系列科研成就的背后,是整个强化学习领域算法在这些年内快速迭代进步的结果,基于模拟器产生的大量数据使得对数据“饥饿”(Data Hungry)的深度神经网络能够表现出很好的拟合效果,从而将强化学习算法的能力充分发挥出来,在以上领域中达到或者超过人类专家的学习表现。目前,强化学习已经从电子游戏逐步走向更广阔的应用场景,如机器人控制、机械手灵巧操作、能源系统调度、网络负载分配、股票期货交易等一系列更加现实和富有意义的领域,对传统控制方法和启发式决策理论发起冲击。
-
-
-
-:width:`400px`
-
-:label:`ch12/ch12-rl-framework`
-强化学习的核心是不断地与环境交互来优化策略从而提升奖励的过程,主要表现为基于某个**状态**(State)下的**动作**(Action)的选择。进行这一决策的对象我们常称为**智能体**(Agent),而这一决策的影响将在**环境**(Environment)中体现。更具体地,不同的决策会影响环境的**状态转移**(State Transition)和**奖励**(Reward)。以上状态转移是环境从当前状态转移到下一状态的函数,它可以是确定性也可以是随机性的。奖励是环境对智能体动作的反馈,通常是一个标量。以上过程可以抽象为 :numref:`ch12/ch12-rl-framework`所示,这是文献中最常见的强化学习的模型描述。
-
-举例来说,当人在玩某个电子游戏的时候,需要逐渐熟悉游戏的操作以取得更好的游戏结果,那么人从刚接触到这个游戏到逐步掌握游戏技巧的这个过程为一个类似于强化学习的过程。该游戏从开始后的任一时刻,会处于一个特定的状态,而人通过观察这个状态会获得一个**观察量**(Observation)(如观察游戏机显示屏的图像),并基于这个观察量做出一个操作动作(如发射子弹),这一动作将改变这个游戏下一时刻的状态,使其转移到下一个状态(如把怪物打败了),并且玩家可以知道当前动作的效果(如产生了一个正或负的分数,怪物打败了则获得正分数)。这时玩家再基于下一个状态的观察量做出新的动作选择,周而复始,直到游戏结束。通过反复的操作和观察,人能够逐步掌握这个游戏的技巧,一个强化学习智能体也是如此。
-
-这里注意,有几个比较关键的问题:一是观察量未必等于状态,而通常观察量是状态的函数,从状态到观察量的映射可能有一定的信息损失。对于观察量等于状态或者根据观察量能够完全恢复环境状态的情况,我们称为**完全可观测**(Fully Observable),否则我们称为**部分可观测**(Partially Observable)环境;二是玩家的每个动作未必会产生立即反馈,某个动作可能在许多步之后才产生效果,强化学习模型允许这种延迟反馈的存在;三是这种反馈对人的学习过程而言未必是个数字,但是我们对强化学习智能体所得到的反馈进行数学抽象,将其转变为一个数字,称为奖励值。奖励值可以是状态的函数,也可以是状态和动作的函数,依具体问题而定。奖励值的存在是强化学习问题的一个基本假设,也是现有强化学习与监督式学习的一个主要区别
-
-强化学习的决策过程通常由一个马尔可夫决策过程(Markov Decision Process,MDP)(马尔可夫决策过程即一个后续状态只依赖当前状态和动作而不依赖于历史状态的函数)描述,可以用一个数组$(\mathcal{S}, \mathcal{A}, R, \mathcal{T}, \gamma)$来表示。$\mathcal{S}$和$\mathcal{A}$分别是状态空间和动作空间,$R$是奖励函数,$R(s,a)$: $\mathcal{S}\times \mathcal{A}\rightarrow \mathbb{R}$为对于当前状态$s\in\mathcal{S}$和当前动作$a\in\mathcal{A}$的奖励值。从当前状态和动作到下一个状态的状态转移概率定义为$\mathcal{T}(s^\prime|s,a)$: $\mathcal{S}\times\mathcal{A}\times\mathcal{S}\rightarrow \mathbb{R}_+$。$\gamma\in(0,1)$是奖励折扣因子(折扣因子可以乘到每个后续奖励值上,从而使无穷长序列有有限的奖励值之和)。强化学习的目标是最大化智能体的期望累计奖励值$\mathbb{E}[\sum_t \gamma^t r_t]$。
-
-马尔可夫决策过程中的马尔可夫性质由以下定义
-
-$$
-\mathcal{T}(s_{t+1}|s_t) = \mathcal{T}(s_{t+1}|s_0, s_1, s_2, \dots, s_t)
-$$
-
-即当前状态转移只依赖于上一时刻状态,而不依赖于整个历史。这里的状态转移函数$\mathcal{T}$中省略了动作$a$,马尔可夫性质是环境转移过程的属性,其独立于产生动作的决策过程。
-
-基于马尔可夫性质,可以进一步推导出在某一时刻最优策略不依赖于整个决策历史,而只依赖于当前最新状态的结论。这一结论在强化学习算法设计中有着重要意义,它简化了最优策略的求解过程。
-
diff --git a/zh_chapters/chapter_reinforcement_learning/single_node_rl.md b/zh_chapters/chapter_reinforcement_learning/single_node_rl.md
deleted file mode 100644
index e14f796..0000000
--- a/zh_chapters/chapter_reinforcement_learning/single_node_rl.md
+++ /dev/null
@@ -1,21 +0,0 @@
-## 单节点强化学习系统
-
-前面介绍了强化学习的基本知识,这里我们介绍常见的单智能体强化学习系统中较为简单的一类,即单节点强化学习系统,这里的节点是指一个用于模型更新的计算单元。我们按照是否对模型更新的过程做并行化处理,将强化学习系统分为单节点和分布式强化学习系统。其中,单节点强化学习系统可以理解为只实例化一个类对象作为智能体,与环境交互进行采样和利用所采得的样本进行更新的过程分别视为这个类内的不同函数。除此之外的更为复杂的强化学习框架都可视为分布式强化学习系统。
-
-分布式强化学习系统的具体形式有很多,系统的形式也往往依赖于所实现的算法。从最简单的情况考虑,假设我们仍在同一个计算单元上实现算法,但是将强化学习的采样过程和更新过程实现为两个并行的进程,甚至各自实现为多个进程,以满足不同计算资源间的平衡。这时就需要进程间通信来协调采样和更新过程,这是一个最基础的分布式强化学习框架。更为复杂的情况是,整个算法的运行在多个计算设备上进行(如一个多机的计算集群),智能体的函数可能需要跨机跨进程间的通信来实现。对于多智能体系统,还需要同时对多个智能体的模型进行更新,则需要更为复杂的计算系统设计。我们将逐步介绍这些不同的系统内的实现机制。
-
-我们先对单节点强化学习系统进行介绍。在这里,我们以RLzoo :cite:`ding2020efficient`为例,讲解一个单节点强化学习系统构建所需要的基本模块。如 :numref:`ch12/ch12-rlzoo`所示,是RLzoo算法库中采用的一个典型的单节点强化学习系统,它包括几个基本的组成部分:神经网络、适配器、策略网络和价值网络、环境实例、模型学习器、经验回放缓存(Experience Replay Buffer)等。
-
-我们先对前三个,神经网络、适配器、策略网络和价值网络进行介绍。神经网络即一般深度学习中的神经网络,用于实现基于数据的函数拟合,我们在图中简单列出常见的三类神经网络:全连接网络,卷积网络和循环网络。策略网络和价值网络是一般深度强化学习的常见组成部分,策略网络即一个由深度神经网络参数化的策略表示,而价值网络为神经网络表示的状态价值(State-Value)或状态-动作价值(State-Action Value)函数。这里我们不妨称前三类神经网络为一般神经网络,策略网络和价值网络为强化学习特定网络,前者往往是后者的重要组成部分。在RLzoo中,适配器则是为实现强化学习特定网络而选配一般神经网络的功能模块。首先,根据不同的观察量类型,强化学习智能体所用的神经网络头部会有不同的结构,这一选择可以由一个基于观察量的适配器来实现;其次,根据所采用的强化学习算法类型,相应的策略网络尾部需要有不同的输出类型,包括确定性策略和随机性策略,RLzoo 中使用一个策略适配器来进行选择;最后,根据不同的动作输出,如离散型、连续型、类别型等,需要使用一个动作适配器来选择。:numref:`ch12/ch12-rlzoo`中我们统称这三个不类型的适配器为适配器。
-
-介绍完这些,我们已经有了可用的策略网络和价值网络,这构成了强化学习智能体核心学习模块。除此之外,还需要一个学习器(Learner)来更新这些学习模块,更新的规则就是强化学习算法给出的损失函数。而要想实现学习模块的更新,最重要的是输入的学习数据,即智能体跟环境交互过程中所采集的样本。对于**离线**(Off-Policy)强化学习,这些样本通常被存储于一个称为经验回放缓存的地方,学习器在需要更新模型时从该缓存中采得一些样本来进行更新。这里说到的离线强化学习是强化学习算法中的一类,强化学习算法可以分为在线(On-Policy)强化学习和离线(Off-Policy)强化学习两类,按照某个特定判据。这个判据是,用于更新的模型和用于采样的模型是否为同一个,如果是,则称在线强化学习算法,否则为离线强化学习算法。因而,离线强化学习通常允许与环境交互所采集的样本被存储于一个较大的缓存内,从而允许在许久之后再从这个缓存中抽取样本对模型进行更新。而对于在线强化学习,这个“缓存”有时其实也是存在的,只不过它所存储的是非常近期内采集的数据,从而被更新模型和用于采样的模型可以近似认为是同一个。从而,这里我们简单表示 RLzoo 的强化学习系统统一包括这个经验回放缓存模块。有了以上策略和价值网络、经验回放缓存、适配器、学习器,我们就得到了 RLzoo 中一个单节点的强化学习智能体,将这个智能体与环境实例交互,并采集数据进行模型更新,我们就得到了一个完整的单节点强化学习系统。这里的环境实例化我们允许多个环境并行采样。
-
-
-
-:width:`800px`
-
-:label:`ch12/ch12-rlzoo`
-近来研究人员发现,强化学习算法领域的发展瓶颈,可能不仅在于算法本身,而在于让智能体在其中采集数据的模拟器的模拟速度。Isaac Gym :cite:`makoviychuk2021isaac`是Nvidia公司于2021年推出的基于GPU(Graphics Processing Unit)的模拟引擎,在单GPU上实现2-3倍于之前基于CPU(Central Processing Unit)的模拟器的运行速度。关于 GPU上运行加速我们已经在章节 5 中有所介绍。之所以 GPU 模拟能够对强化学习任务实现显著的加
-速效果,除了 GPU 本身多核心的并行运算能力之外,还在于这省却了 CPU 与 GPU 之间的数据传输和通信时间。传统的强化学习环境,如 OpenAI Gym(这是一个常用的强化学习基准测试环境)等,都是基于 CPU 进行的模拟计算,而深度学习方法的神经网络训练通常是在 GPU 或TPU(Tensor Processing Unit) 上进行的。
-
-从智能体与 CPU 上实例化的模拟环境交互过程所收集的数据样本,通常先暂时以 CPU 的数据格式存储,在使用的时候被转移到 GPU 上成为具有 GPU 数据类型的数据(如使用 PyTorch 时可通过tensor.to(device)的函数实现,只需将device设为“cuda”即可将一个类型为torch.Tensor的tensor转移到GPU上),然后来进行模型训练。同时,由于模型参数是以 GPU 上数据的类型存储的,调用模型进行前向传递的过程中也需要先将输入数据从 CPU 转移到 GPU 上,并且可能需要将模型输出的 GPU 数据再转移回 CPU 类型。这一系列冗余的数据转换操作都会显著增长模型学习的时间,并且也增加了算法实际使用过程中的工程量。Isaac Gym 模拟器的设计从模拟器下层运行硬件上解决了这一困难,由于模拟器和模型双双实现在 GPU 上,他们之间的数据通信不再需要通过 CPU 来实现,从而绕过了 CPU 与 GPU 数据双向传输这一问题,实现了对强化学习任务中模拟过程的特定加速。
\ No newline at end of file
diff --git a/zh_chapters/chapter_reinforcement_learning/summary.md b/zh_chapters/chapter_reinforcement_learning/summary.md
deleted file mode 100644
index b5beb86..0000000
--- a/zh_chapters/chapter_reinforcement_learning/summary.md
+++ /dev/null
@@ -1,3 +0,0 @@
-## 小结
-
-在这一章,我们简单介绍了强化学习的基本概念,包括单智能体和多智能体强化学习算法、单节点和分布式强化学习系统等,给读者对强化学习问题的基本认识。当前,强化学习是一个快速发展的深度学习分支,许多实际问题都有可能通过强化学习算法的进一步发展得到解决。另一方面,由于强化学习问题设置的特殊性(如需要与环境交互进行采样等),也使得相应算法对计算系统的要求更高:如何更好地平衡样本采集和策略训练过程?如何均衡 CPU 和 GPU 等不同计算硬件的能力?如何在大规模分布式系统上有效部署强化学习智能体?都需要对计算机系统的设计和使用有更好的理解。
\ No newline at end of file
diff --git a/zh_chapters/chapter_rl_sys/control.md b/zh_chapters/chapter_rl_sys/control.md
deleted file mode 100644
index 766e6c8..0000000
--- a/zh_chapters/chapter_rl_sys/control.md
+++ /dev/null
@@ -1,22 +0,0 @@
-## 控制系统
-
-虽然控制理论已牢牢植根于基于模型(Model-based)的设计思想,但丰富的数据和机器学习方法给控制理论带来了新的机遇。控制理论和机器学习的交叉方向涵盖了广泛的研究方向以及在各种现实世界系统中的应用。
-
-### 线性二次控制
-
-理论方面,线性二次控制(Linear-Quadratic Control)是经典的控制方法。若动力系统可以用一组线性微分方程表示,而其约束为二次泛函,这类的问题称为线性二次问题。此类问题的解即为线性二次调节器(Linear–Quadratic Regulator),简称LQR。最近有关于图神经网络在分布式线性二次控制的研究,将线性二次问题转换为自监督学习问题,能够找到基于图神经网络的最佳分布式控制器,他们还推导出了所得闭环系统稳定的充分条件。
-
-### 模型预测控制
-
-模型预测控制(MPC)是一种先进的过程控制方法,用于在满足一组约束条件的同时控制过程。MPC 的主要优势在于它允许优化当前时刻的同时考虑未来时刻。因此与线性二次调节器不同。MPC 还具有预测未来事件的能力,并可以相应地采取控制措施。最近有研究将最优控制和机器学习相结合并应用在陌生环境中的视觉导航任务:比如基于学习的感知模块产生一系列航路点通过无碰撞路径引导机器人到达目标,基于模型的规划器使用这些航路点来生成平滑且动态可行的轨迹,然后使用反馈控制在物理系统上执行。实验表明,与纯粹基于几何映射或基于端到端学习的方案相比,这种新的系统可以更可靠、更有效地到达目标位置。
-
-### 控制系统的稳定性分析
-
-因为安全对机器人应用是至关重要的,有的强化学习方法通过学习动力学的不确定性来提高安全性,鼓励安全、稳健、以及可以正式认证所学控制策略的方法,如 图:numref:`safe\_learning\_control`展示了安全学习控制(Safe Learning Control)系统的框架图。Lyapunov 函数是评估非线性动力系统稳定性的有效工具,最近有人提出Neural Lyapunov来将安全性纳入考虑。
-
-
-
-:width:`800px`
-
-:label:`safe\_learning\_control`
-
diff --git a/zh_chapters/chapter_rl_sys/control_code_ex.md b/zh_chapters/chapter_rl_sys/control_code_ex.md
deleted file mode 100644
index 0565e01..0000000
--- a/zh_chapters/chapter_rl_sys/control_code_ex.md
+++ /dev/null
@@ -1,113 +0,0 @@
-## 控制系统案例
-
-在上一章节中,我们初步了解了机器人的控制系统,同时也知道了机器学习在机器人控制系统这个领域有着很多有趣和有前景的研究方向。
-只不过由于控制系统的复杂性和这些研究的前瞻性,它们不太适合用来作为简单的案例。
-
-与此同时,ROS作为一个成熟的机器人框架,它已经包含了很多成熟稳定的经典控制组件。
-这些控制组件和其他的成熟的功能模块一起组成了更大规模的功能模组,来完成更复杂的任务。
-
-在这些更大规模的功能模组中,**Nav2**和**MoveIt2**可能是最常用的两个。
-
-从名字上就可以看出来,这两个功能模组各自都是它们ROS1版本的继承者。
-Nav2是ROS Navigation Stack在ROS2中的继承者,专注于移动机器人的导航相关的功能,例如定位,路径规划等,并致力于用安全的方式将机器人从一点移动到另一点。
-MoveIt2是ROS MoveIt在ROS2中的继承者,致力于打造一个容易使用的机器人操纵平台。带机械臂的机器人都基本离不开它。
-
-这两个模组都成熟,可靠,和容易使用。使用ROS框架开发机器人是基本上都会直接使用它们或者在它们已有功能的基础上做适合自己的自定义修改,以避免重复造轮子。
-
-因此,在本章节中,我们将以Nav2为案例,来带领大家初步了解怎样使用一个大型的ROS2功能模组。
-
-本章节的内容很大程度参考了Nav2的[英文官方文档](https://navigation.ros.org/),尤其是“Getting Started”这一章。对自己英文有信心的读者可以尝试阅读官方文档以了解更多细节。
-
-本章没有额外的代码案例。
-
-### 安装
-
-首先,让我们通过Ubuntu的库管理器来安装Nav2相关的程序库。
-
-```shell
-sudo apt install ros-foxy-navigation2 ros-foxy-nav2-bringup
-```
-
-其中`ros-foxy-navigation2`是Nav2的核心程序库,而`ros-foxy-nav2-bringup`则是Nav2的一个启动案例。
-这个案例十分灵活,很多时候我们可以将其稍加修改后放到自己的项目中使用。
-
-接下来让我们安装`turtlebot3`相关的一系列程序库。
-turtlebot系列是一个很成功的入门级移动机器人系列。
-而这一系列程序库则提供了和turtlebot3机器人相关的组件,其中包含了在模拟环境中使用虚拟turtlebot3机器人的相关功能组件。
-
-```shell
-sudo apt install "ros-foxy-turtlebot3*"
-```
-
-### 运行
-
-在安装好上面的那些程序库后,我们就可以尝试使用Nav2了。
-
-首先,让我们新开一个终端窗口,并执行以下命令。这些命令分别导入了ROS2框架,并设定好了我们要使用哪个Turtlebot3模型和在哪儿搜索虚拟世界(Gazebo)需要的模型。
-
-```shell
-source /opt/ros/foxy/setup.bash
-export TURTLEBOT3_MODEL=waffle
-export GAZEBO_MODEL_PATH=$GAZEBO_MODEL_PATH:/opt/ros/foxy/share/turtlebot3_gazebo/models
-```
-
-现在,我们一切就绪,可以下面这行命令来运行一个Nav2的演示程序。
-
-```shell
-ros2 launch nav2_bringup tb3_simulation_launch.py
-```
-
-其中`ros2 launch`命令是用来执行一个launch文件,而后者则是将很多需要启动的ROS2组件集合到一起来按计划启动的一个说明文件。
-一个机器人项目经常需要启动很多个不同的组件来配合完成任务。
-而如果每个组件都要新开一个窗口执行命令的话,整个机器人的启动将会变得十分繁琐。
-launch文件和`ros2 launch`命令就是来解决这个问题的。
-我们可以把整个ROS2项目想象成一个交响乐团,其中每个组件分别代表一个乐器。
-而launch文件就像是乐团的指挥,负责调配每个乐器应该在什么时候启动。
-总而言之,这是ROS2中一个非常使用的特性。
-
-关于`ros2 launch`命令和launch文件的更多细节,感兴趣的读者可以查阅[官方英文文档](https://docs.ros.org/en/foxy/Tutorials/Launch/Creating-Launch-Files.html)。
-
-成功运行上述命令之后,我们应该会看到两个新开的GUI窗口,分别对应`RViz`和`Gazebo`程序。
-其中`RViz`是ROS2框架的可视化接口,我们稍后将通过它来控制我们的虚拟机器人。
-而`Gazebo`则是一个用过创建和运行虚拟世界的软件。
-它独立于ROS2框架,但两者又互相紧密合作。
-
-在`Gazebo`窗口中(如下图所示),我们应该能够看到一个三维的类六边形虚拟世界。
-这个世界中还有一个虚拟的Turtlebot3机器人。
-这个机器人发射出很多蓝色的射线。
-这些射线代表了机器人的激光雷达的读数射线。
-而激光雷达的读数则被Nav2用来在环境中定位机器人。
-
-
-
-在`RViz`窗口中(如下图所示),我们应该能够看到虚拟世界的一个二维地图。
-地图上的白色部分是机器人可以到达的部分,而黑色则是检测到的障碍物或墙。
-如果你在左侧看到有红色的`Global Status: Error`错误的话,你的机器人并没有在RViz(即ROS2框架)中正确的定位。
-请在工具栏选择`2D Pose Estimate`并在RViz地图上机器人应该在的位置(以Gazebo中机器人的位置为准)更新好机器人的姿态。
-
-
-
-更新好机器人的姿态后,RViz应该和下图比较相似。
-
-
-
-这样一来,我们的机器人就准备好在虚拟事件中移动了。
-
-请在RViz的工具栏中选择`Navigation2 Goal`按钮,并在地图上选择你想要Turtlebot3机器人最终所到达的位置和姿态。
-一旦选好了,你将会看到机器人开始向目标位置移动并最终到达目标。
-
-RViz还提供了很多其它的Nav2功能的按钮,你可以通过Nav2和ROS2的官方英文文档来了解更多使用方法。
-
-恭喜,你现在初步了解了怎样使用ROS2框架内的大型功能模组!
-
-#### 章节附录:在WSL中使用Nav2
-
-有些读者可能是通过Windows下的WSL(Windows Subsystem for Linux)来运行ROS2的。
-如果是这种情况,这一章节中的图形界面程序,如RViz和Gazebo,可能会造成问题。
-这是因为WSL默认并不能打开图形界面程序。
-
-幸运的是,我们可以更改设置来达到在WSL中运行图形界面程序这一点。
-[这篇笔记](https://github.com/rhaschke/lecture/wiki/WSL-install)介绍了其作者是如何在WSL中运行ROS2和图形界面的。其中第二点尤为值得注意。
-而[这篇笔记](https://github.com/cascadium/wsl-windows-toolbar-launcher#firewall-rules)则更为细致的介绍了在一般情况下怎样在WSL中运行图形界面程序。
-
-这两篇笔记应该可以给读者足够的信息来解决上述所说的和RViz还有Gazebo相关的问题。唯一的缺点就是这两篇笔记都是英文的,对读者的英语水平有一定要求。
\ No newline at end of file
diff --git a/zh_chapters/chapter_rl_sys/index.md b/zh_chapters/chapter_rl_sys/index.md
deleted file mode 100644
index f982d7b..0000000
--- a/zh_chapters/chapter_rl_sys/index.md
+++ /dev/null
@@ -1,18 +0,0 @@
-# 机器人系统
-
-本章介绍机器学习的一个重要分支——机器人及其在系统方面的知识,学习目标包括:
-
-- 掌握机器人系统基本知识。
-
-- 掌握感知系统、规划系统和控制系统。
-
-- 掌握通用机器人操作系统。
-
-```toc
-:maxdepth: 2
-
-rl_sys_intro
-ros
-ros_code_ex
-summary
-```
diff --git a/zh_chapters/chapter_rl_sys/perception.md b/zh_chapters/chapter_rl_sys/perception.md
deleted file mode 100644
index d8893b6..0000000
--- a/zh_chapters/chapter_rl_sys/perception.md
+++ /dev/null
@@ -1,44 +0,0 @@
-## 感知系统
-
-感知系统不仅包括视觉感知,还可以包含触觉、声音等。在未知环境中,机器人想实现自主移动和导航必须知道自己在哪(通过相机重定位 :cite:`ding2019camnet`),周围什么情况(通过3D物体检测 :cite:`yi2020segvoxelnet`或语义分割),预测相机在空间的轨迹 :cite:`9813561`,这些要依靠感知系统来实现 :cite:`xu2019depth`。
-一提到感知系统,不得不提的就是即时定位与建图(Simultaneous Localization
-and
-Mapping,SLAM)系统。SLAM大致过程包括地标提取、数据关联、状态估计、状态更新以及地标更新等。视觉里程计Visual
-Odometry是SLAM中的重要部分,它估计两个时刻机器人的相对运动(Ego-motion)。ORB-SLAM系列是视觉SLAM中有代表性的工作, :numref:`orbslam3` 展示了最新的ORB-SLAM3的主要系统组件。香港科技大学开源的基于单目视觉与惯导融合的SLAM技术VINS-Mono也很值得关注。多传感器融合、优化数据关联与回环检测、与前端异构处理器集成、提升鲁棒性和重定位精度都是SLAM技术接下来的发展方向。
-
-最近,随着机器学习的兴起,基于学习的SLAM框架也被提了出来。TartanVO是第一个基于学习的视觉里程计(VO)模型,该模型可以推广到多个数据集和现实世界场景,并优于传统基于几何的方法。
-UnDeepVO是一个无监督深度学习方案,能够通过使用深度神经网络估计单目相机的
-6-DoF 位姿及其视图深度。DROID-SLAM是用于单目、立体和
-RGB-D 相机的深度视觉 SLAM,它通过Bundle
-Adjustment层对相机位姿和像素深度的反复迭代更新,具有很强的鲁棒性,故障大大减少,尽管对单目视频进行了训练,但它可以利用立体声或
-RGB-D 视频在测试时提高性能。其中,Bundle Adjustment
-(BA)与机器学习的结合被广泛研究。CMU提出通过主动神经
-SLAM
-的模块化系统帮助智能机器人在未知环境中的高效探索。
-
-### 物体检测与语义分割
-
-感知系统不仅包括视觉感知,还可以包含触觉、声音等。在未知环境中,机器人想实现自主移动和导航必须知道自己在哪(通过相机重定位 :cite:`ding2019camnet`),周围什么情况(通过3D物体检测 :cite:`yi2020segvoxelnet`或语义分割),预测相机在空间的轨迹 :cite:`9813561`,这些要依靠感知系统来实现 :cite:`xu2019depth`。
-
-图像语义分割作为一项常用而又经典的感知技术,经过多年不停的迭代,传统的2D技术已经渐渐的趋于成熟,提升空间较小。同时传统的2D语义分割有一定的局限性,很难从2D图像中直接获知物体的空间位置、以及其在整体空间中的布局,要知道整体空间的位置信息还是需要更多的三维信息。为了让机器人从单纯的2D图像出发,得到空间中物体三维的坐标、语义和边界信息,跨视角语义分割 :cite:`9123682`吸引了众多研究者的关注。
-
-### 即时定位与建图(SLAM)
-
-将一个机器人放到未知的环境中,如何能让它明白自己的位置和周围环境?这要靠即时定位与建图(Simultaneous Localization and Mapping,SLAM)系统来实现。
-
-图:numref:`orbslam3` 展示了最新的ORB-SLAM3的主要系统组件。
-SLAM大致过程包括地标提取、数据关联、状态估计、状态更新以及地标更新等。SLAM系统在机器人运动过程中通过重复观测到的地图特征(比如,墙角,柱子等)定位自身位置和姿态,再根据自身位置增量式的构建地图,从而达到同时定位和地图构建的目的。
-
-DROID-SLAM是用于单目、立体和 RGB-D 相机的深度视觉 SLAM,它通过Bundle Adjustment层对相机位姿和像素深度的反复迭代更新,具有很强的鲁棒性,故障大大减少,尽管对单目视频进行了训练,但它可以利用立体声或 RGB-D 视频在测试时提高性能。
-其中,Bundle Adjustment (BA)描述了像素坐标和重投影坐标之间误差的和,重投影坐标通常使用3D坐标点和相机参数计算得到。BA计算量较大较为耗时,爱丁堡大学提出通过分布式多GPU系统 :cite:`MegBA` 对BA计算进行加速。随着机器学习的发展,BA与机器学习的结合被广泛研究。
-
-视觉里程计Visual Odometry是SLAM中的重要部分,它估计两个时刻机器人的相对运动。
-最近,随着机器学习的兴起,基于学习的VO框架也被提了出来。
-TartanVO是第一个基于学习的视觉里程计(VO)模型,该模型可以推广到多个数据集和现实世界场景,并优于传统基于几何的方法。
-
-
-
-:width:`800px`
-
-:label:`orbslam3`
-
diff --git a/zh_chapters/chapter_rl_sys/perception_code_ex.md b/zh_chapters/chapter_rl_sys/perception_code_ex.md
deleted file mode 100644
index 5c969d8..0000000
--- a/zh_chapters/chapter_rl_sys/perception_code_ex.md
+++ /dev/null
@@ -1,212 +0,0 @@
-## 感知系统案例
-
-在之前[机器人操作系统(ROS)的入门案例](./ros_code_ex.md)这一章节中,我们学习了怎样创建一个ROS2项目以及怎样使用ROS2框架下的节点,服务,动作等。然后,我们又在上一章节中初步了解了机器人的感知系统。
-在这一章节中,我们将通过一个简单的案例来演示怎样结合ROS2和深度学习框架PyTorch来完成一个我们设想的感知系统中的一个基本功能。
-
-### 案例背景
-
-假设我们想要帮某果园设计一款全自动摘菠萝机器人。
-这个机器人可能需要有一个智能移动底盘来负责在果园中移动,若干传感器(包括一个RGB摄像头)来检测菠萝,以及一个机械臂来负责摘取动作。
-在这个机器人需要完成的一长列各种功能中,它的感知系统必然需要能检测摄像头传感器的画面中央是否有一个菠萝。
-检测到了菠萝才会进入到摘取的环节。
-
-这个检测在图像中央是否有菠萝存在的功能,就是我们机器人的感知系统中基础但必要的一个基本功能。
-幸运的是,随着现代卷积神经网络的发展,我们可以利用已存在的深度学习框架,如PyTorch,来快速的完成这个功能。
-而且一个简单的使用ImageNet进行预训练的AlexNet就以及足够了。
-
-在之前的案例中,我们都是使用的ROS2框架下的程序库。在这个例子中,我们将开始了解如何在ROS2中使用框架外的Python库。
-
-和之前的案例类似,本章节的案例所使用的代码可以在本书相关的[ROS2案例代码库](https://github.com/openmlsys/openmlsys-ros2)中的`src/object_detector`文件夹内找到。
-
-### 项目搭建
-
-让我们沿用之前已经搭建好的ROS2项目框架。
-我们只需在其中增加一个ROS2的Python库来实现我们想要的功能即可。
-因此,让我们回到`src`目录下并创建此Python库。
-
-```shell
-cd openmlsys-ros2/src
-ros2 pkg create --build-type ament_python --node-name object_detector_node object_detector --dependencies rclpy std_msgs sensor_msgs cv_bridge opencv-python torch torchvision torchaudio
-```
-
-在创建好Python库后,别忘了将`package.xml`和`setup.py`中的`version`,`maintainer`,`maintainer_email`,`description`和`license`项都更新好。
-
-紧接着,我们需要安装ROS2框架下的`image_publisher`库。
-这个库能帮助我们将一张图片模拟成像摄像头视频一样的图片流。
-在开发真是机器人时,我们可能可以在实机上检测我们的程序,但是对于这个案例,我们只能使用这个`image_publisher`库和若干选择好的图片来测试我们的程序。
-实际上,就算是开发实际机器人的功能,也最好在实际测试之前使用图片来做这个功能的单元测试。
-
-我们只需通过ubuntu的`apt`来安装这个`image_publisher`库,因为作为一个常用的ROS2框架下的程序库,它已经被打包好以便通过ubuntu的包管理器来安装。
-
-```shell
-sudo apt install ros-foxy-image-publisher
-```
-
-关于`image_publisher`这个库更多的信息和使用方法,可以查看[它的文档](http://wiki.ros.org/image_publisher)。这是个针对早期ROS1版本的文档,但是因为这个库之后没有任何变化,文档中所有的功能都和我们所使用的ROS2版本中的一样。
-
-接下来,让我们在ROS2项目的Python虚拟环境中安装`opencv-python`,`torch`,`torchvision`和`torchaudio`。
-例如使用`pipenv`的用户可能会执行`pipenv install opencv-python torch torchvision torchaudio`这条命令。
-
-最后,让我们把下面这两张菠萝和苹果的图片保存在`openmlsys-ros2/data`下。
-我们将使用这两张图片来检测我们的程序可以检测到菠萝并且不会把菠萝当成苹果。
-
-
-
-:width:`256px`
-
-:label:`ros2-pineapple`
-
-
-
-:width:`256px`
-
-:label:`ros2-apple`
-
-### 添加代码
-
-之前创建Python库的命令应该已经帮我们创建好了`src/object_detector/object_detector/object_detector_node.py`这个文件。现在让我们用以下内容来替换掉此文件中已有的内容。
-
-```Python
-import rclpy
-from rclpy.node import Node
-
-from std_msgs.msg import Bool
-from sensor_msgs.msg import Image
-import cv2
-from cv_bridge import CvBridge
-
-import torch
-import torchvision.models as models
-from torchvision import transforms
-
-
-class ObjectDetectorNode(Node):
-
- PINEAPPLE_CLASS_ID = 953
-
- def __init__(self):
- super().__init__('object_detector_node')
- self.detection_publisher = self.create_publisher(Bool, 'object_detected', 10)
- self.camera_subscriber = self.create_subscription(
- Image, 'camera_topic', self.camera_callback, 10,
- )
- self.alex_net = models.alexnet(pretrained=True)
- self.alex_net.eval()
- self.preprocess = transforms.Compose([
- transforms.ToPILImage(),
- transforms.Resize(256),
- transforms.CenterCrop(224),
- transforms.ToTensor(),
- transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),
- ])
- self.cv_bridge = CvBridge()
- self.declare_parameter('detection_class_id', self.PINEAPPLE_CLASS_ID)
- self.get_logger().info(f'Detector node is ready.')
-
- def camera_callback(self, msg: Image):
- self.get_logger().info(f'Received an image, ready to detect!')
- detection_class_id = self.get_parameter('detection_class_id').get_parameter_value().integer_value
- img = self.cv_bridge.imgmsg_to_cv2(msg)
- input_batch = self.preprocess(img).unsqueeze(0)
- img_output = self.alex_net(input_batch)[0]
- detection = Bool()
- detection.data = torch.argmax(img_output).item() == detection_class_id
- self.detection_publisher.publish(detection)
- self.get_logger().info(f'Detected: "{detection.data}", target class id: {detection_class_id}')
-
-
-def main(args=None):
- rclpy.init(args=args)
- object_detector_node = ObjectDetectorNode()
- rclpy.spin(object_detector_node)
- object_detector_node.destroy_node()
- rclpy.shutdown()
-
-
-if __name__ == '__main__':
- main()
-```
-
-可能有些细心的读者已经发现了,这段代码和我们之前创建ROS2节点的代码非常像。
-实际上这段代码就是创建了一个新的节点类来完成我们的功能。
-
-这个节点类的实例将被赋予名字`object_detector_node`,同时它将订阅`camera_topic`这个主题并发布`Bool`类型的信息至`object_detected`主题。
-其中,`camera_topic`主题的内容是机器人的摄像头传感器所接收到的视频流,而我们将用`image_publisher`库和之前的图片来模拟这个视频流。
-而`object_detected`主题则将包含我们的检测结果以供机器人逻辑链的后续节点使用。
-如果我们检测到菠萝,则我们将发布`True`信息,否则就发布`False`信息。
-
-下面,让我们关注这个新节点类中的一些新细节。
-
-首先,我们引入了`cv_bridge.CvBridge`这个类。
-这个类是ROS2框架内的一个功能类,主要帮我们把图片在`opencv`/`numpy`格式和ROS2自己的`sensor_msgs.msg.Image`信息格式之间进行转换。
-在我们新的节点类中我们可以看到它的具体用法(即`self.cv_bridge = CvBridge()`和`img = self.cv_bridge.imgmsg_to_cv2(msg)`)。
-
-然后,在新的节点类`ObjectDetectorNode`中,我们使用了`PINEAPPLE_CLASS_ID`这个类成员变量来保存我们想要识别的物体在ImageNet中的类别ID(class id)。这里`953`是菠萝在ImageNet中的具体类别ID。
-
-再之后,我们通过PyTorch实例化了一个预训练好的AlexNet,并将其设置到`eval`状态。
-同时,我们声明了`detection_class_id`这个参数,以方便再运行时修改需要识别物体的类别ID(虽然这并不常用)。
-
-最后,在`camera_topic`主题的回调函数`camera_callback`中,我们将收到的`Image`类型信息传换成`numpy`格式,然后调用AlexNet来进行物体识别,最后将识别结果以`Bool`的形式发布到`object_detected`主题上去,并进行日志记录。
-
-至此,一个使用PyTorch和AlexNet来识别摄像头中是否有菠萝的节点类就完成了。
-
-### 运行及检测
-
-下面,让我们尝试运行我们新写好的节点类并用菠萝和苹果的图片来检测这个节点类是否运行正常。
-
-首先,让我们编译这个新写的Python库。
-
-```shell
-cd openmlsys-ros2
-colcon build --symlink-install
-```
-
-在成功编译之后,我们可以新开一个终端窗口并执行下面的命令来运行一个节点类实例。
-记住,你可能需要先运行`source install/local_setup.zsh`来引入我们自己的ROS2项目。
-
-```shell
-ros2 run object_detector object_detector_node --ros-args -r camera_topic:=image_raw
-```
-
-如果你遇到`ModuleNotFoundError: No module named 'cv2'`这之类的问题,则代表ROS2命令没有成功识别你Python虚拟环境中的程序库。这时候你可以尝试进入你所用的虚拟环境后执行下面这个命令。
-
-```shell
-PYTHONPATH="$(dirname $(which python))/../lib/python3.8/site-packages:$PYTHONPATH" ros2 run object_detector object_detector_node --ros-args -r camera_topic:=image_raw
-```
-
-这个命令前面`PYTHONPATH="$(dirname $(which python))/../lib/python3.8/site-packages:$PYTHONPATH"`这一串的作用是将你目前Python环境的库添加到`PYTHONPATH`,这样ROS2命令的Python就可以找到你目前Python环境(即ROS2项目所对应的Python虚拟环境)中的Python库了。
-
-当这个ROS2命令成功运行时,你应该能看到这行信息:`[INFO] [1655172977.491378700] [object_detector_node]: Detector node is ready.`。
-
-另外,在这个ROS2命令中,我们使用了`--ros-args -r camera_topic:=image_raw`这一系列参数。
-这些参数是用来告诉ROS2将我们新节点类所使用的`camera_topic`主题重映射(remap)到`image_raw`这个主题上。
-这样一来,我们新节点类所有使用`camera_topic`主题的场合实际上都是在使用`image_raw`这个主题。
-使用主题名字重映射的好处是在于解耦合。
-对于每个新的ROS2程序库或者每个新的节点类,我们都可以自由的命名我们要使用的主题的名字,然后当它需要和其它组件组合起来发挥作用时,只需要使用重映射将两个不同组件所使用的不同主题名字连接起来,就可以达到数据在两个组件之间正常流通的效果。
-这实际上是ROS2框架的一个很实用的特性。
-
-如果你想更深入的了解重映射相关的细节,可以阅读[这篇官方介绍](https://design.ros2.org/articles/static_remapping.html)。
-
-在我们成功运行新节点后,让我们在一个新终端窗口中运行下面这行命令来测试它是否能检测到菠萝。同样的,你可能需要先运行`source install/local_setup.zsh`来引入我们自己的ROS2项目。
-
-```shell
-PYTHONPATH="$(dirname $(which python))/../lib/python3.8/site-packages:$PYTHONPATH" ros2 run image_publisher image_publisher_node data/ros-pineapple.jpg --ros-args -p publish_rate:=1.0
-```
-
-上面这行命令将会使用`image_publisher`库和它的节点来以1Hz的频率将之前准备好的菠萝图片发布到`image_raw`这个主题上去。
-当这个`image_publisher_node`节点成功运行后,我们应当能在`object_detector_node`节点运行的终端窗口中看到类似`[INFO] [1655174212.930385900] [object_detector_node]: Detected: "True", target class id: 953`这样的信息来证明我们的节点类能够检测到菠萝。
-
-接着让我们在`image_publisher_node`节点的窗口中使用`Ctrl+C`结束掉节点,然后使用下面这行命令来发布准备好的苹果图片。
-
-```shell
-PYTHONPATH="$(dirname $(which python))/../lib/python3.8/site-packages:$PYTHONPATH" ros2 run image_publisher image_publisher_node data/ros-apple.jpg --ros-args -p publish_rate:=1.0
-```
-
-现在,在`object_detector_node`节点运行的终端窗口中我们应该看到的是类似`[INFO] [1655171989.912783400] [object_detector_node]: Detected: "False", target class id: 953`这样的信息来证明我们的节点类不会把苹果识别成菠萝。
-
-### 小结
-
-恭喜,你已经成功了解如何在ROS2项目中使用ROS2框架外的Python库了!
-如果你使用Python虚拟环境,你可能需要额外的设置`PYTHONPATH`环境变量。
-另外,主题名字重映射(Name Remapping)是一个很有用的ROS2特性。
-你在以后的项目中很可能会经常用到它。
\ No newline at end of file
diff --git a/zh_chapters/chapter_rl_sys/planning.md b/zh_chapters/chapter_rl_sys/planning.md
deleted file mode 100644
index b016047..0000000
--- a/zh_chapters/chapter_rl_sys/planning.md
+++ /dev/null
@@ -1,14 +0,0 @@
-## 规划系统
-
-机器人规划不仅包含运动路径规划,还包含任务规划 :cite:`9712373` :cite:`wang2023mimicplay`,:cite:`li2023behavior`。其中,运动规划是机器人技术的核心问题之一,在给定的两个位置之间为机器人找到一条符合约束条件的路径。这个约束可以是无碰撞、路径最短、机械功最小等,需要有概率完整性和最优性的保证,从导航到复杂环境中的机械臂操作都有运动规划的应用。然而,当经典运动规划在处理现实世界的机器人问题(在高维空间中)时,挑战仍然存在。研究人员仍在开发新算法来克服这些限制,包括优化计算和内存负载、更好地规划表示和处理维度灾难等。
-
-同时,机器学习的一些进展为机器人专家研究运动规划问题开辟了新视角:以数据驱动的方式解决经典运动规划器的瓶颈。基于深度学习的规划器可以使用视觉或语义输入进行规划等。ML4KP是一个可用于运动动力学进行运动规划的C++库,可以轻松地将机器学习方法集成到规划过程中。
-
-
-强化学习在规划系统上也有重要应用 :cite:`sun2021adversarial`,最近有一些工作基于MetaDrive模拟器 :cite:`li2021metadrive`进行多智能体强化学习、驾驶行为分析等 :cite:`peng2021learning` :cite:`peng2021safe` :cite:`li2021efficient`。为了更好地说明强化学习是如何应用在自动驾驶中,尤其是作为自动驾驶规划模块的应用, 图:numref:`rl\_ad`展示了一个基于深度强化学习的自动驾驶POMDP模型,包含环境、奖励、智能体等重要组件。
-
-
-
-:width:`800px`
-
-:label:`rl\_ad`
diff --git a/zh_chapters/chapter_rl_sys/planning_code_ex.md b/zh_chapters/chapter_rl_sys/planning_code_ex.md
deleted file mode 100644
index 2e3b8fb..0000000
--- a/zh_chapters/chapter_rl_sys/planning_code_ex.md
+++ /dev/null
@@ -1,208 +0,0 @@
-## 规划系统案例
-
-在上一章节中,我们初步了解了机器人的规划系统。
-这一章节中,我们将通过一个简单的案例来演示怎样结合ROS2和机器学习框架scikit-learn来完成一个我们设想的规划系统中的一个基本功能。
-我们将使用和[感知系统案例](./perception_code_ex.md)这一章节类似的方法和结构来讲解本章节。
-
-### 案例背景
-
-假设我们想要帮某花园设计一款打理鸢尾花的园丁机器人。
-很“碰巧”的是,这个小花园里面正好只有经典的[鸢尾花数据集](https://scikit-learn.org/stable/auto_examples/datasets/plot_iris_dataset.html)中的那三种鸢尾花,而且已经有人帮我们完成了一个“魔术般的”ROS2感知组件来自动的检测目标鸢尾花的花萼长和宽以及花瓣长和宽(Sepal Length, Sepal Width, Petal Length and Petal Width:鸢尾花数据集所需要的4个输入维度)。
-同时因为机器人的性能限制,我们不能使用比较复杂的模型(例如神经网络)。
-这种情况下,我们可以尝试使用经典的机器学习模型,例如决策树,来接受感知组件的结果并识别鸢尾花的类别,然后用一个映射表(mapping table)来查找出我们应该为机器人规划怎样的行为去执行。
-当季节或情况改变时,花园的技术团队可以更新映射表来更改机器人的规划系统逻辑。
-
-当然,上面的案例背景和解决方案都是为了生成一个简单的案例而设计的“非现实”的例子。
-大家在现实项目中遇到的案例应该会复杂的多。
-不过,我们任然希望这样一个简单的案例可以为大家带来些许价值。
-
-让我们回到我们刚刚介绍的解决方案中。
-在之前的感知系统的案例中,我们选择使用ROS2节点类来处理感知任务。
-这是因为机器人会不断的接收到传感器的信号,而我们希望尽可能多的处理收到的信号。
-而对于我们这一章节的案例来说,因为我们不一定需要不间断的进行新的规划,同时每一次规划我们都期待有一个结果,所以使用ROS2服务可能会是一个更好的选择。
-
-和之前的案例类似,本章节的案例所使用的代码可以在本书相关的[ROS2案例代码库](https://github.com/openmlsys/openmlsys-ros2)中的`src/action_decider`文件夹内找到。
-
-### 项目搭建
-
-让我们继续沿用之前已经搭建好的ROS2项目框架。
-和感知系统案例类似,我们只需在其中增加一个ROS2的Python库来实现我们想要的功能即可。
-因此,让我们回到`src`目录下并创建此Python库。
-
-```shell
-cd openmlsys-ros2/src
-ros2 pkg create --build-type ament_python --node-name action_decider_node action_decider --dependencies rclpy std_msgs scikit-learn my_interfaces
-```
-
-我们将`my_interfaces`添加为依赖项是因为我们需要为新的ROS2服务创建对应的消息类型接口。
-
-在创建好Python库后,别忘了将`package.xml`和`setup.py`中的`version`,`maintainer`,`maintainer_email`,`description`和`license`项都更新好。
-
-接下来,让我们在ROS2项目的Python虚拟环境中安装`scikit-learn`。
-例如使用`pipenv`的用户可能会执行`pipenv install scikit-learn`这条命令。
-
-### 添加消息类型接口
-
-我们将要编写的新ROS2服务需要有它自己的服务消息接口。
-让我们借用已有的`my_interfaces`库来放置这个新接口。
-
-首先,让我们在`openmlsys-ros2/src/my_interfaces/srv`中新建一个名为`IrisData.srv`的文件并用下面的内容填充它。
-
-```text
-float32 sepal_length
-float32 sepal_width
-float32 petal_length
-float32 petal_width
----
-string action
-```
-
-我们可以看到,新的ROS2服务将会接受4个浮点值作为输入。
-这4个浮点值分别为鸢尾花的花萼的长和宽还有花瓣的长和宽。
-当规划完成后,服务会返回一个字符串。
-这个字符串将会是机器人需要执行的动作的名称。
-
-我们还需要在`my_interfaces`库的`CMakeLists.txt`文件中的相应位置(`rosidl_generate_interfaces`函数的参数部分)添加一行新的内容:
-
-```cmake
-"srv/IrisData.srv"
-```
-
-最后,别忘了在ROS2项目的根目录下执行`colcon build --packages-select my_interfaces`来重新编译`my_interfaces`这个库。
-
-### 添加代码
-
-之前创建Python库的命令应该已经帮我们创建好了`src/action_decider/action_decider/action_decider_node.py`这个文件。现在让我们用以下内容来替换掉此文件中已有的内容。
-
-```Python
-import os
-import pickle
-
-import rclpy
-from rclpy.node import Node
-
-from std_msgs.msg import String
-from my_interfaces.srv import IrisData
-
-from sklearn.datasets import load_iris
-from sklearn import tree
-
-
-def main(args=None):
- rclpy.init(args=args)
- action_decider_service = ActionDeciderService()
- rclpy.spin(action_decider_service)
- action_decider_service.destroy_node()
- rclpy.shutdown()
-
-
-class ActionDeciderService(Node):
-
- IRIS_CLASSES = ['setosa', 'versicolor', 'virginica']
-
- IRIS_ACTION_MAP = {
- 'setosa': 'fertilise',
- 'versicolor': 'idle',
- 'virginica': 'prune',
- }
-
- DEFAULT_MODEL_PATH = f'{os.path.dirname(__file__)}/../../../data/iris_model.pickle'
-
- def get_iris_classifier(self, model_path):
- if os.path.isfile(model_path):
- with open(model_path, 'rb') as model_file:
- return pickle.load(model_file)
- self.get_logger().info(f"Cannot find trained model at '{model_path}', will train a new model.")
- iris = load_iris()
- X, y = iris.data, iris.target
- clf = tree.DecisionTreeClassifier()
- clf = clf.fit(X, y)
- with open(model_path, 'wb') as model_file:
- pickle.dump(clf, model_file)
- return clf
-
- def __init__(self):
- super().__init__('iris_action_decider_service')
- self.srv = self.create_service(IrisData, 'iris_action_decider', self.decide_iris_action_callback)
- self.iris_classifier = self.get_iris_classifier(self.DEFAULT_MODEL_PATH)
- self.get_logger().info('Iris action decider service is ready.')
-
- def decide_iris_action_callback(self, request, response):
- iris_data = [request.sepal_length, request.sepal_width, request.petal_length, request.petal_width]
- iris_class_idx = self.iris_classifier.predict([iris_data])[0]
- iris_class = self.IRIS_CLASSES[iris_class_idx]
- response.action = self.IRIS_ACTION_MAP[iris_class]
- self.get_logger().info(
- f'Incoming request\nsepal_length: {request.sepal_length}\nsepal_width: {request.sepal_width}'
- f'\npetal_length: {request.petal_length}\npetal_width: {request.petal_width}'
- f'\niris class: {iris_class}'
- f'\ndecided action: {response.action}'
- )
-
- return response
-
-
-if __name__ == '__main__':
- main()
-```
-
-细心的读者可能已经发现了,这段代码和我们之前创建的使用ROS2服务的服务端节点类的代码非常像。
-实际上这段代码就是使用了同样的服务端节点类框架和一个新的服务来完成我们想要的功能。
-
-这个服务端节点类的实例将被赋予名字`iris_action_decider_service`,它将提供一个名为`iris_action_decider`的服务并且这个服务期待`IrisData`格式的服务请求(即我们之前定义的消息类型接口的请求部分)。
-当服务计算完成后,它将把结果返回给请求发起方。
-这个结果是规划好的行为的名字并被封装到`IrisData`格式的服务结果中去(即我们之前定义的消息类型接口的结果部分)。
-
-下面,让我们关注这个新节点类中的一些新细节。
-
-首先,我们在新的服务端节点类`ActionDeciderService`中声明了三个类成员变量`IRIS_CLASSES`,`IRIS_ACTION_MAP`和`DEFAULT_MODEL_PATH`。
-它们分别表示鸢尾花的类别标签,鸢尾花类别至机器人行动名称的映射表,和默认存放训练好的决策树模型的路径。
-
-当我们的服务端节点类初始化时,它将调用`get_iris_classifier()`来读取训练好的决策树模型。
-如果模型文件缺失,则会重新训练一个模型并保存。
-这里我们把训练模型的代码放到了同一个节点内。
-实际上,对于大型项目或大型模型,我们可以把模型训练和模型使用分开到不同的组件中去,并且它们可能在不同的时机运行。
-
-当服务的回调函数`decide_iris_action_callback()`被调用时,服务将会使用训练好的模型和接收到的鸢尾花信息来预测鸢尾花的类别,然后通过查找映射表来决定机器人需要执行的动作。最后服务返回结果并进行日志记录。
-
-至此,一个使用scikit-learn和决策树的简易“玩具级”规划组件就完成了。
-
-### 运行及检测
-
-下面,让我们尝试运行新写好的服务端节点类并检测它是否能正常运行。
-
-首先,让我们编译这个新写的Python库。
-
-```shell
-cd openmlsys-ros2
-colcon build --symlink-install
-```
-
-在成功编译之后,我们可以新开一个终端窗口并执行下面的命令来运行一个节点类实例。
-记住,你可能需要先运行`source install/local_setup.zsh`来引入我们自己的ROS2项目。
-
-```shell
-ros2 run action_decider action_decider_node
-```
-
-如果你使用了Python虚拟环境,则可以尝试下面这条命令,而不是上面那条。背后具体的原因已在之前的案例章节叙述过。
-
-```shell
-PYTHONPATH="$(dirname $(which python))/../lib/python3.8/site-packages:$PYTHONPATH" ros2 run action_decider action_decider_node
-```
-
-当这个ROS2命令成功运行时,你应该能看到这行信息:`[INFO] [1655253519.693893500] [iris_action_decider_service]: Iris action decider service is ready.`。
-
-在我们成功运行新的服务端节点后,让我们在一个新终端窗口中运行下面这行命令来测试新的服务是否能正常运行。同样的,你可能需要先运行`source install/local_setup.zsh`来引入我们自己的ROS2项目。
-
-```shell
-ros2 service call /iris_action_decider my_interfaces/srv/IrisData "{sepal_length: 1.0, sepal_width: 2.0, petal_length: 3.0, petal_width: 4.0}"
-```
-
-这里,我们用的`ros2 service call`命令是专门用来通过命令行调用一个ROS2服务的命令。其中服务请求的数据应该是字符串化的YAML格式数据。这个命令更多的信息可以通过`ros2 service call -h`来查阅。
-
-一切顺利的话,执行完命令后不久,你应该就能在新窗口中很快看到类似这样的信息了:`response: my_interfaces.srv.IrisData_Response(action='prune')`。
-
-### 小结
-
-恭喜,你已经成功了解如何在ROS2项目中使用scikit-learn这样库并训练一个模型了!
\ No newline at end of file
diff --git a/zh_chapters/chapter_rl_sys/rl_sys_intro.md b/zh_chapters/chapter_rl_sys/rl_sys_intro.md
deleted file mode 100644
index 781f6b5..0000000
--- a/zh_chapters/chapter_rl_sys/rl_sys_intro.md
+++ /dev/null
@@ -1,134 +0,0 @@
-## 机器人系统概述
-
-机器人学是一个交叉学科,它涉及了计算机科学、机械工程、电气工程、生物医学工程、数学等多种学科,并有诸多应用,比如自动驾驶汽车、机械臂、无人机、医疗机器人等。机器人能够自主地完成一种或多种任务或者辅助人类完成指定任务。通常,人们把机器人系统划分为感知系统、决策(规划)和控制系统等组成部分。
-
-机器人系统按照涉及的机器人数量,可以划分为单机器人学习系统和多机器人学习系统。多机器人学习系统协作和沟通中涉及的安全和隐私问题,也会是一个值得研究的方向。最近机器人学习系统在室内自主移动 :cite:`9123682,huang2018navigationnet`,道路自动驾驶 :cite:`pmlr-v155-huang21a,pmlr-v155-sun21a,Sun2022SelfSupervisedTA`,机械臂工业操作等行业场景得到充分应用和发展。一些机器人学习基础设施项目也在进行中,如具备从公开可用的互联网资源、计算机模拟和 真实机器人试验中学习能力的大规模的计算系统RoboBrain。在自动驾驶领域,受联网的自动驾驶汽车 (CAV) 对传统交通运输行业的影响,“车辆计算”(Vehicle Computing) 概念引起广泛关注,并激发了如何让计算能力有限使用周围的CAV计算平台来执行复杂的计算任务的研究。最近,有很多自动驾驶系统的模拟器,代表性的比如CARLA,MetaDrive :cite:`li2021metadrive`,CarSim和TruckSim,它们可以作为各种自动驾驶算法的训练场并对算法效果进行评估。另外针对自动驾驶的系统开发平台也不断涌现,如ERDOS、D3 (Dynamic Deadline-Driven)和Pylot,可以让模型训练与部署系统与这些平台对接。
-
-
-
-:width:`800px`
-
-:label:`vehicle-computing`
-
-:numref:`learning\_decision\_module`是一个典型的感知、规划、控制的模块化设计的自动驾驶系统框架图,绿线表示自主驾驶系统的模块化流程,而橙色虚线表示规划和控制模块是不可微的。但是决策策略可以通过重新参数化技术进行训练,如蓝色虚线所示。接下来将按照这个顺序依次介绍感知系统、规划系统和控制系统。
-
-
-
-:width:`800px`
-
-:label:`learning\_decision\_module`
-
-### 感知系统
-
-感知系统不仅包括视觉感知,还可以包含触觉、声音等。在未知环境中,机器人想实现自主移动和导航必须知道自己在哪(通过相机重定位 :cite:`ding2019camnet`),周围什么情况(通过3D物体检测 :cite:`yi2020segvoxelnet`或语义分割),预测相机在空间的轨迹 :cite:`9813561`,这些要依靠感知系统来实现 :cite:`xu2019depth`。
-一提到感知系统,不得不提的就是即时定位与建图(Simultaneous Localization
-and
-Mapping,SLAM)系统。SLAM大致过程包括地标提取、数据关联、状态估计、状态更新以及地标更新等。视觉里程计Visual
-Odometry是SLAM中的重要部分,它估计两个时刻机器人的相对运动(Ego-motion)。ORB-SLAM系列是视觉SLAM中有代表性的工作, :numref:`orbslam3` 展示了最新的ORB-SLAM3的主要系统组件。香港科技大学开源的基于单目视觉与惯导融合的SLAM技术VINS-Mono也很值得关注。多传感器融合、优化数据关联与回环检测、与前端异构处理器集成、提升鲁棒性和重定位精度都是SLAM技术接下来的发展方向。
-
-最近,随着机器学习的兴起,基于学习的SLAM框架也被提了出来。TartanVO是第一个基于学习的视觉里程计(VO)模型,该模型可以推广到多个数据集和现实世界场景,并优于传统基于几何的方法。
-UnDeepVO是一个无监督深度学习方案,能够通过使用深度神经网络估计单目相机的
-6-DoF 位姿及其视图深度。DROID-SLAM是用于单目、立体和
-RGB-D 相机的深度视觉 SLAM,它通过Bundle
-Adjustment层对相机位姿和像素深度的反复迭代更新,具有很强的鲁棒性,故障大大减少,尽管对单目视频进行了训练,但它可以利用立体声或
-RGB-D 视频在测试时提高性能。其中,Bundle Adjustment
-(BA)与机器学习的结合被广泛研究。CMU提出通过主动神经
-SLAM
-的模块化系统帮助智能机器人在未知环境中的高效探索。
-
-#### 物体检测与语义分割
-
-感知系统不仅包括视觉感知,还可以包含触觉、声音等。在未知环境中,机器人想实现自主移动和导航必须知道自己在哪(通过相机重定位 :cite:`ding2019camnet`),周围什么情况(通过3D物体检测 :cite:`yi2020segvoxelnet`或语义分割),预测相机在空间的轨迹 :cite:`9813561`,这些要依靠感知系统来实现 :cite:`xu2019depth`。
-
-图像语义分割作为一项常用而又经典的感知技术,经过多年不停的迭代,传统的2D技术已经渐渐的趋于成熟,提升空间较小。同时传统的2D语义分割有一定的局限性,很难从2D图像中直接获知物体的空间位置、以及其在整体空间中的布局,要知道整体空间的位置信息还是需要更多的三维信息。为了让机器人从单纯的2D图像出发,得到空间中物体三维的坐标、语义和边界信息,跨视角语义分割 :cite:`9123682`吸引了众多研究者的关注。
-
-#### 即时定位与建图(SLAM)
-
-将一个机器人放到未知的环境中,如何能让它明白自己的位置和周围环境?这要靠即时定位与建图(Simultaneous Localization and Mapping,SLAM)系统来实现。
-
-:numref:`orbslam3` 展示了最新的ORB-SLAM3的主要系统组件。
-SLAM大致过程包括地标提取、数据关联、状态估计、状态更新以及地标更新等。SLAM系统在机器人运动过程中通过重复观测到的地图特征(比如,墙角,柱子等)定位自身位置和姿态,再根据自身位置增量式的构建地图,从而达到同时定位和地图构建的目的。
-
-DROID-SLAM是用于单目、立体和 RGB-D 相机的深度视觉 SLAM,它通过Bundle Adjustment层对相机位姿和像素深度的反复迭代更新,具有很强的鲁棒性,故障大大减少,尽管对单目视频进行了训练,但它可以利用立体声或 RGB-D 视频在测试时提高性能。
-其中,Bundle Adjustment (BA)描述了像素坐标和重投影坐标之间误差的和,重投影坐标通常使用3D坐标点和相机参数计算得到。BA计算量较大较为耗时,爱丁堡大学提出通过分布式多GPU系统 :cite:`MegBA` 对BA计算进行加速。随着机器学习的发展,BA与机器学习的结合被广泛研究。
-
-视觉里程计Visual Odometry是SLAM中的重要部分,它估计两个时刻机器人的相对运动。
-最近,随着机器学习的兴起,基于学习的VO框架也被提了出来。
-TartanVO是第一个基于学习的视觉里程计(VO)模型,该模型可以推广到多个数据集和现实世界场景,并优于传统基于几何的方法。
-
-
-
-:width:`800px`
-
-:label:`orbslam3`
-
-### 规划系统
-
-机器人规划不仅包含运动路径规划,还包含任务规划 :cite:`9712373` :cite:`wang2023mimicplay` :cite:`li2023behavior`。其中,运动规划是机器人技术的核心问题之一,在给定的两个位置之间为机器人找到一条符合约束条件的路径。这个约束可以是无碰撞、路径最短、机械功最小等,需要有概率完整性和最优性的保证,从导航到复杂环境中的机械臂操作都有运动规划的应用。然而,当经典运动规划在处理现实世界的机器人问题(在高维空间中)时,挑战仍然存在。研究人员仍在开发新算法来克服这些限制,包括优化计算和内存负载、更好地规划表示和处理维度灾难等。
-
-同时,机器学习的一些进展为机器人专家研究运动规划问题开辟了新视角:以数据驱动的方式解决经典运动规划器的瓶颈。基于深度学习的规划器可以使用视觉或语义输入进行规划等。ML4KP是一个可用于运动动力学进行运动规划的C++库,可以轻松地将机器学习方法集成到规划过程中。
-
-
-强化学习在规划系统上也有重要应用 :cite:`sun2021adversarial`,最近有一些工作基于MetaDrive模拟器 :cite:`li2021metadrive`进行多智能体强化学习、驾驶行为分析等 :cite:`peng2021learning` :cite:`peng2021safe` :cite:`li2021efficient`。为了更好地说明强化学习是如何应用在自动驾驶中,尤其是作为自动驾驶规划模块的应用, :numref:`rl\_ad`展示了一个基于深度强化学习的自动驾驶POMDP模型,包含环境、奖励、智能体等重要组件。
-
-
-
-:width:`800px`
-
-:label:`rl\_ad`
-
-### 控制系统
-
-虽然控制理论已牢牢植根于基于模型(Model-based)的设计思想,但丰富的数据和机器学习方法给控制理论带来了新的机遇。控制理论和机器学习的交叉方向涵盖了广泛的研究方向以及在各种现实世界系统中的应用。
-
-#### 线性二次控制
-
-理论方面,线性二次控制(Linear-Quadratic Control)是经典的控制方法。若动力系统可以用一组线性微分方程表示,而其约束为二次泛函,这类的问题称为线性二次问题。此类问题的解即为线性二次调节器(Linear–Quadratic Regulator),简称LQR。最近有关于图神经网络在分布式线性二次控制的研究,将线性二次问题转换为自监督学习问题,能够找到基于图神经网络的最佳分布式控制器,他们还推导出了所得闭环系统稳定的充分条件。
-
-#### 模型预测控制
-
-模型预测控制(MPC)是一种先进的过程控制方法,用于在满足一组约束条件的同时控制过程。MPC 的主要优势在于它允许优化当前时刻的同时考虑未来时刻。因此与线性二次调节器不同。MPC 还具有预测未来事件的能力,并可以相应地采取控制措施。最近有研究将最优控制和机器学习相结合并应用在陌生环境中的视觉导航任务:比如基于学习的感知模块产生一系列航路点通过无碰撞路径引导机器人到达目标,基于模型的规划器使用这些航路点来生成平滑且动态可行的轨迹,然后使用反馈控制在物理系统上执行。实验表明,与纯粹基于几何映射或基于端到端学习的方案相比,这种新的系统可以更可靠、更有效地到达目标位置。
-
-#### 控制系统的稳定性分析
-
-因为安全对机器人应用是至关重要的,有的强化学习方法通过学习动力学的不确定性来提高安全性,鼓励安全、稳健、以及可以正式认证所学控制策略的方法,如 :numref:`safe\_learning\_control`展示了安全学习控制(Safe Learning Control)系统的框架图。Lyapunov 函数是评估非线性动力系统稳定性的有效工具,最近有人提出Neural Lyapunov来将安全性纳入考虑。
-
-
-
-:width:`800px`
-
-:label:`safe\_learning\_control`
-
-### 在机器人项目中安全的应用机器学习
-
-机器人和机器学习都是有广阔前景和令人兴奋的前沿领域,而当它们结合在一起后,会变得更加迷人,并且有远大于1+1>2的效果。 因此,当我们在机器人项目中应用机器学习时,我们很容易过于兴奋,尝试着用机器学习去做很多之前只能幻想的成果。 然而,在机器人中应用机器学习和直接使用机器学习有着很多不同。 其中很重要的一点不同就是,一般的机器学习系统更多的是在虚拟世界中造成直接影响,而机器人中的机器学习系统很容易通过机器人对物理世界造成直接影响。 因此,**当我们在机器人项目中应用机器学习时,我们必须时刻关注系统的安全性**,保证无论是在产品开发时还是在产品上市后的使用期,开发者和用户的安全性都能得到可靠的保证。 而且不仅商业项目要考虑安全性,开发个人项目是也需要确保安全性。 没有人想因为安全性上的疏忽而对自己或朋友/同事造成无法挽回的遗憾。
-
-以上这些并不是危言耸听,让我们设想以下这些情况:
-假设你正在为你们公司开发一个物流仓库内使用的移动货运机器人,它被设计为和工人在同一工作环境内运行,以便在需要时及时帮工人搬运货物至目的地。 这个机器人有一个视觉的行人识别系统,以便识别前方是否有人。 当机器人在前进的过程中遇到障碍物的话,这个行人识别系统会参与决定机器人的行为。 如果有人的话,机器人会选择绕大弯来避开行进道路上的行人障碍物;而如果没人的话,机器人可以绕小弯来避障。 可是,如果某次这个行人识别系统检测失误,系统没有检测到前方的障碍物是一个正在梯子上整理货物的工人,所以选择小弯避障。 而当机器人靠近时,工人才突然发现有个机器人正在靠近他,并因此受到惊吓跌落至机器人行进的正前方。如果我们考虑到物流仓库的货运机器人自重加载重一般至少是几百公斤,我们就知道万一真的因此发生碰撞,后果是不堪设想。 如果真的发生这种情况,这个机器人产品的商业前景会毁于一旦,公司和负责人也会被追究相应责任(甚至法律意义上的责任)。更重要的是,对受害者所造成的伤害和自己心里的内疚会对双方的一生都造成严重的影响。
-
-不仅是商业项目,假设你正在开发一个小型娱乐机械臂来尝试帮你完成桌面上的一些小任务,例如移动茶杯或打开关闭开关。 你的这个机械臂也依赖于一个物体识别系统来识别任务目标。 某次在移动茶杯时,机械臂没有识别到规划路线中有一个接线板,因此茶杯不小心摔倒并且水泼到接线板里引起短路。 幸运的话可能只需要换一个接线板,而不幸的时候甚至可能会引起火灾或电击。 我相信,没有人会想遇到这类突发事件。
-
-因此,无论是在怎样的机器人项目中应用机器学习,我们都必须时刻关注和确保系统的安全性。
-
-#### 确保安全性的办法:风险评估和独立的安全系统
-
-##### 风险评估
-
-为了能够确保机器人和机器学习系统的安全性,我们首先要知道可能有哪些危险。 我们可以通过风险评估(Risk Assessment)来做到这一点。
-怎样完成一份风险评估网上已经有很多文章了,我们在这里就不过多的介绍。 我们想要强调的是,对于发现的风险,我们需要尽可能的给出一个避免风险的方案(Risk Mitigation)。 更重要的时,我们需要确保这些方案的具体执行,而不仅仅是流于表面的给出方案就完事。 一份没有执行的方案等于没有方案。
-
-##### 独立的安全系统
-
-在了解了可能有哪些风险之后,我们可以通过设计一个独立的安全系统来规避掉风险中和机器人系统相关的那一部分。
-具体来讲,这个安全系统应该独立于机器学习系统,并且处于机器人架构的底层和拥有足够或最高等级的优先级。 实际上,这个安全系统不应该只针对机器学习系统,而是应该针对整个机器人的方方面面。 或者换句话来说,当开发机器人项目时,必须要有一个足够安全且独立的安全系统。 而针对于机器学习系统的安全性只是这个独立安全系统“足够安全”的部分体现罢了。
-还是以之前的那个物流仓库移动货运机器人为例。 如果机器人的轮子是有独立安全回路并且断电自动刹车的轮子,而机器人又有一个严格符合安全标准且也有安全回路的激光雷达来检测障碍物,同时这个激光雷达的安全回路直接连接至轮子的安全回路。 这样一来,不管机器人是否检测到前方有人或突然有一个人闯入机器人行进路线,激光雷达都会检测到有异物,直接通过独立的安全回路将轮子断电并刹车,以确保不会发生碰撞。 这样一个配置完全独立于任何控制逻辑,从而不受任何上层系统的影响。 **而对于开发者来说,当我们有了一个可靠独立的安全系统,我们也可以放心的去使用最新的突破性技术,而不用担心新技术是否会造成不可预期的后果。**
-
-#### 机器学习系统的伦理问题
-
-除了上述讨论到的最根本的安全性问题,机器学习系统的伦理问题也会对机器人的使用造成影响。
-
-例如训练数据集中人种类型不平衡这一类经典的伦理问题。 让我们还是以之前的那个物流仓库移动货运机器人为例。 如果我们的训练数据集只有亚洲人的图片,那么当我们想要开拓海外市场时,我们的海外用户很有可能会发现我们的机器人并不能很好的识别他们的工人。 虽然独立的安全系统可以避免事故的发生,但是急停在工人面前肯定不是一个很好的用户体验。 我们机器人的海外销量也会受到影响。
-
-机器学习系统的伦理问题是目前比较火热的一个讨论领域。作为行业相关人员,我们需要了解这个方向上的最新进展。一方面是在系统设计的初期就把这些问题考虑进去,另一方面也是希望我们的成果能够给更多人带来幸福,而不是带去困扰。
-
-
diff --git a/zh_chapters/chapter_rl_sys/robot_learning.md b/zh_chapters/chapter_rl_sys/robot_learning.md
deleted file mode 100644
index 93971e8..0000000
--- a/zh_chapters/chapter_rl_sys/robot_learning.md
+++ /dev/null
@@ -1,124 +0,0 @@
-## 机器人交互环境
-
-在机器人学习领域,获取在真实世界设置中操纵物体的能力可能是一个耗时且资源密集的过程。这不仅需要大量努力,还需要大量硬件投资。为了应对这些挑战并加速学习过程,研究人员转向使用仿真环境的数据驱动方法。通过模拟各种场景,这些环境使机器人能够在不需要与真实世界直接交互的情况下学习并做出明智的决策。在本章中,我们将探讨使用仿真环境进行机器人决策的概念,重点介绍一些模拟器示例及其关键特性,同时与现实世界和底层硬件考虑进行比较。
-
-
-### 在仿真环境中学习:
-
-仿真器已成为以受控和高效方式训练机器人的不可或缺的工具。与仅依赖于真实世界经验不同,仿真环境提供了一种经济有效的方式,生成大量训练数据。这种方法不仅节省时间,还减少了在潜在危险或昂贵环境中操作物理机器人的风险。此外,仿真器提供了创建多样化场景和操纵各种环境参数的灵活性,允许研究人员全面探索不同的学习策略,并优化机器人决策算法。
-
-
-
-如表所示,领域中有多个仿真器示例。
-
-### 仿真器与现实世界的比较:
-
-
-
-虽然仿真环境提供了许多优势,但认识到这些虚拟世界与现实世界之间的差异至关重要。一个关键的区别是物理和动力学建模可能存在的差异。仿真器通常近似物理交互,可能与实际物理系统的复杂性和细节不同。研究人员必须意识到这些限制,并仔细验证他们在现实世界场景中学习到的策略,以确保鲁棒性和泛化性。
-
-另一个考虑因素是感测输入。在仿真中,传感器可以提供完美、无噪声的数据,而现实世界中的传感器容易受到噪声、校准问题和视野限制的影响。在学习过程中考虑这些差异,并应用适当的技术(如传感器噪声注入或域适应)对于成功将学习到的策略从仿真转移到现实至关重要。
-
-### 硬件考虑:
-
-虽然仿真环境减少了对昂贵硬件设置的需求,但某些与硬件相关的方面不应被忽视。为了准确模拟机器人行为,需要使用与所研究的物理机器人密切相似的硬件模型和运动学表示。此外,为了确保高效和实时的仿真,尤其在处理复杂场景或大规模仿真时,可能需要高性能计算资源。
-
-### 结论:
-
-仿真环境已成为训练机器人和实现高效决策的宝贵工具。通过利用这些虚拟世界,研究人员可以加快学习过程,同时减少与真实世界实验相关的成本和风险。然而,重要的是要承认仿真的局限性以及将所学策略转移到物理系统的挑战。通过仔细的验证、传感器校准和硬件建模,可以弥合仿真与现实之间的差距,为现实环境中稳健和可靠的机器人决策能力铺平道路。
-
-
-## 机器人技能学习
-### 感知
-
-
-在令人着迷的机器人领域中,感知在使机器人能够与周围世界互动并理解它们起着至关重要的作用。就像人类依赖于他们的感官来收集信息一样,机器人使用各种感测方式来感知并理解其环境。本章深入探讨机器人感知领域,重点是多种感测方式的整合及其在增强机器人对周围环境理解方面的重要性。我们将探索可供机器人使用的多种感测方式及其在感知方面的独特能力。
-
-**视觉感知:**
-视觉感知是机器人的主要感测方式之一,模仿人类视觉。相机和图像传感器捕获视觉数据,使机器人能够感知物体、场景和空间信息。本节讨论计算机视觉技术(如图像处理、物体识别和深度估计)在使机器人解释视觉数据并提取有意义信息方面的作用。
-
-**触觉感知:**
-触觉感知关注机器人感知和解释与物体和表面的物理接触的能力。嵌入在机器人手指或手中的触觉传感器提供有关纹理、形状、硬度和温度的信息。本节探讨触觉传感器的整合及其在物体操纵、抓握和精细运动控制中的应用,使机器人能够以更类似于人类的方式与物理世界互动。
-
-**听觉感知:**
-声音和听觉线索是机器人获取信息的宝贵来源。通过整合麦克风或专门的听觉传感器,机器人可以感知和分析音频信号,例如语音、环境声音和定位线索。本节讨论听觉感知在诸如语音识别、声源定位和人机交互等任务中的作用,强调音频信息对于全面机器人感知的重要性。
-
-**范围感知:**
-范围感测方式,如激光雷达(光检测和测距)和深度相机,为机器人提供了有关周围环境的深度信息。通过发射和测量飞行时间或结构光模式,机器人可以创建环境的详细三维表示。本节探讨范围感测方式在物体检测、同时定位和映射(SLAM)以及在动态环境中的导航能力。
-
-**环境感知:**
-机器人还可以使用各种传感器感知环境,这些传感器捕获超出人类感官范围的信息。本节涵盖了如红外传感器、气体传感器和环境监测设备等感测方式。这些传感器使机器人能够检测温度、气体浓度、湿度和其他环境因素,使它们适用于环境监测、灾难响应和工业环境中的应用。
-
-**感测方式的融合和整合:**
-为了实现对环境的更全面了解,机器人通常会整合多种感测方式。本节探讨融合来自不同传感器的数据时所
-
-面临的挑战和技术,如传感器校准、数据对齐和传感器融合算法。它还讨论了传感器融合在提高感知准确性、鲁棒性和适应性方面的益处。
-
-**结论:**
-机器人感知是一个迷人的领域,涵盖了多种感测方式,每种都为机器人理解周围环境做出了贡献。通过整合视觉、触觉、听觉、范围和环境感测,机器人可以创建世界的丰富表示。本章概述了不同感测方式,强调了它们在使机器人能够在复杂环境中导航、互动和做出明智决策方面的重要性。通过利用多样化的感测方式,机器人在感知、学习和适应方面继续取得进步,使我们更接近一个智能机器与人类和谐共存的世界。
-
-
-### 决策
-在机器人领域,决策对于使机器人能够智能地与环境互动至关重要。本章探讨了多种机器人决策方法,包括启发式策略、强化学习、可供性学习,以及从大型模型中提取知识。通过理解这些技术,我们可以洞察机器人如何做出明智且适应性强的决策。
-
-**启发式策略:**
-启发式策略指的是基于预定义规则或启发式的决策策略。这些规则通常由人类专家制定,捕捉特定领域的知识以指导机器人的行为。启发式策略为机器人在某些情境下提供了快速可靠的决策方式,但它们可能缺乏适应性,在复杂和动态的环境中难以应用。尽管如此,它们可作为机器人决策的一个有用的起点,以便在更复杂的技术被采用之前使用。
-
-**强化学习:**
-强化学习(RL)是一种强大的方法,使机器人能够通过与环境的交互来学习决策策略。在 RL 中,机器人通过采取行动并观察其结果来学习如何最大化数值奖励信号。通过探索不同的行动并接收以奖励或惩罚形式的反馈,机器人逐渐发现决策的最优策略。
-
-强化学习包括以下关键要素:
-- 代理(Agent):机器人或决策实体。
-- 环境(Environment):代理互动的外部世界或仿真。
-- 状态(State):当前情况或上下文的表示。
-- 行动(Action):代理可供选择的行动。
-- 奖励(Reward):反馈信号,表明在给定状态下行动的可取性。
-
-**可供性学习:**
-
-\begin{figure}
- \centering
- \includegraphics[width=\textwidth]{figs/ch13/affordance.pdf}
- \caption{机器人操纵任务中的可供性可视化结果。}
- \label{fig:affordance-results}
-\end{figure}
-
-可供性学习侧重于理解环境为机器人提供的行动可能性。它涉及感知和提取关于可供性的相关信息,这些是对象或场景可以提供的潜在行动或互动。通过识别和理解可供性,机器人可以做出更明智的行动决策。
-
-可供性学习包括以下步骤:
-- 感知(Perception):通过各种传感器(例如,相机、深度传感器)感知环境,捕获相关数据。
-- 特征提取(Feature Extraction):从感测数据中提取有意义的特征,以表示对象或场景。
-- 可供性识别(Affordance Recognition):识别和分类对象或场景提供的潜在行动或互动。
-- 决策制定(Decision-Making):利用识别出的可供性来指导机器人的决策过程。
-
-**从大型模型中提取知识:**
-随着深度学习和大规模语言模型的发展,从这些模型中提取知识对于机器人决策
-
-变得越来越有价值。这些模型接受了大量数据的训练,并捕获了复杂的模式和关系。通过利用这些知识,机器人可以从这些模型中获取的集体智慧中受益。
-
-通常,从大型模型中提取知识包括以下步骤:
-- 模型可解释性(Model Interpretability):理解模型如何处理输入数据并生成预测或决策。
-- 特征提取(Feature Extraction):从模型中提取相关特征或表示,捕获决策所需的基本信息。
-- 迁移学习(Transfer Learning):从预训练模型中转移知识,以改善特定机器人任务中的决策。
-- 决策融合(Decision Fusion):将从大型模型中提取的知识与其他决策技术相结合,以做出更明智和稳健的决策。
-
-机器人决策是使机器人能够智能地与环境互动的关键方面。启发式策略提供了初始指导,强化学习允许机器人通过与环境的交互来学习最佳决策策略。可供性学习帮助机器人识别和理解其周围的潜在行动。最后,从大型模型中提取知识利用这些模型中捕获的信息丰富来增强决策能力。通过整合这些技术,机器人可以在各种情景中做出更具适应性、情境意识和智能的决策,这将显著推动机器人学习领域的发展。
-
-## 在真实环境中的部署
-
-在机器人领域中,机器人做出智能决策的能力对其与真实世界有效互动至关重要。多年来,人们在开发算法和技术上取得了显著进展,使机器人能够直接在真实环境中学习和做出决策。在本章中,我们将探讨与机器人决策相关的一些关键主题,包括在真实环境中直接学习、Sim2Real 方法、真实世界反馈、从真实世界示范中学习,以及教师-学生蒸馏的概念。
-
-### 在真实环境中直接学习
-机器人决策的一个基本方法涉及直接在真实环境中学习。传统方法通常依赖于仿真或简化的场景,但在真实世界条件下学习为机器人提供了对所遇到的复杂性和不确定性的更准确理解。这种方法利用了诸如强化学习之类的技术,其中机器人通过试错学习,根据从环境中获得的反馈优化其决策策略。
-
-### Sim2Real 和真实世界反馈
-虽然在真实环境中学习是可取的,但由于安全考虑、成本和真实世界场景的有限访问等限制,这可能具有挑战性。Sim2Real 方法通过最初在仿真环境中训练机器人来应对这些挑战,这些环境更便宜、更安全,并提供更广泛的数据。然而,为了确保在真实世界中有效地做出决策,训练有素的策略需要转移到物理领域并进行适应。真实世界反馈机制,如域适应技术和带微调的强化学习,在此过程中起到了架接仿真与现实差距的重要作用。
-
-### 从真实世界示范中学习
-从真实世界示范中学习是机器人决策的另一种强大范式。通过观察和模仿人类或专家的示范,机器人可以获得有关适当决策策略的宝贵知识。这种方法通常涉及诸如模仿学习或逆强化学习之类的技术,其中机器人从熟练个体的行动和决策中学习。通过从有限数量的示范中泛化,机器人可以学会在类似情境中做出智能决策。
-
-### 教师-学生蒸馏
-教师-学生蒸馏是一种利用更有能力的教师模型的知识来增强经验较少的学生模型决策能力的方法。在机器人学习的背景下,这种方法涉及训练一个高性能的策略(教师),并使用其专业知识指导和改进一个较不理想的策略(学生)的学习过程。在直接进行强化学习具有挑战性或耗时的情况下,这种技术特别有用。教师模型可以提供宝贵的反馈和约束,以促进复杂真实世界环境中高效的决策。
-
-### 结论
-在真实环境中的机器人决策是一个多方面的领域,涵盖了多种方法和技术。直接在真实环境中学习、利用 Sim2Real 方法、纳入真实世界反馈、从示范中学习以及采用教师-学生蒸馏,都是提升机器人能力的重要方面。作为研究人员和从业者,我们继续探索这些主题,以增强机器人的学习和决策能力,使它们能够在多样化的真实世界环境中有效且智能地运作。
diff --git a/zh_chapters/chapter_rl_sys/robot_safety.md b/zh_chapters/chapter_rl_sys/robot_safety.md
deleted file mode 100644
index 39ac1e2..0000000
--- a/zh_chapters/chapter_rl_sys/robot_safety.md
+++ /dev/null
@@ -1,31 +0,0 @@
-## 在机器人项目中安全的应用机器学习
-
-机器人和机器学习都是有广阔前景和令人兴奋的前沿领域,而当它们结合在一起后,会变得更加迷人,并且有远大于1+1>2的效果。 因此,当我们在机器人项目中应用机器学习时,我们很容易过于兴奋,尝试着用机器学习去做很多之前只能幻想的成果。 然而,在机器人中应用机器学习和直接使用机器学习有着很多不同。 其中很重要的一点不同就是,一般的机器学习系统更多的是在虚拟世界中造成直接影响,而机器人中的机器学习系统很容易通过机器人对物理世界造成直接影响。 因此,**当我们在机器人项目中应用机器学习时,我们必须时刻关注系统的安全性**,保证无论是在产品开发时还是在产品上市后的使用期,开发者和用户的安全性都能得到可靠的保证。 而且不仅商业项目要考虑安全性,开发个人项目是也需要确保安全性。 没有人想因为安全性上的疏忽而对自己或朋友/同事造成无法挽回的遗憾。
-
-以上这些并不是危言耸听,让我们设想以下这些情况:
-假设你正在为你们公司开发一个物流仓库内使用的移动货运机器人,它被设计为和工人在同一工作环境内运行,以便在需要时及时帮工人搬运货物至目的地。 这个机器人有一个视觉的行人识别系统,以便识别前方是否有人。 当机器人在前进的过程中遇到障碍物的话,这个行人识别系统会参与决定机器人的行为。 如果有人的话,机器人会选择绕大弯来避开行进道路上的行人障碍物;而如果没人的话,机器人可以绕小弯来避障。 可是,如果某次这个行人识别系统检测失误,系统没有检测到前方的障碍物是一个正在梯子上整理货物的工人,所以选择小弯避障。 而当机器人靠近时,工人才突然发现有个机器人正在靠近他,并因此受到惊吓跌落至机器人行进的正前方。如果我们考虑到物流仓库的货运机器人自重加载重一般至少是几百公斤,我们就知道万一真的因此发生碰撞,后果是不堪设想。 如果真的发生这种情况,这个机器人产品的商业前景会毁于一旦,公司和负责人也会被追究相应责任(甚至法律意义上的责任)。更重要的是,对受害者所造成的伤害和自己心里的内疚会对双方的一生都造成严重的影响。
-
-不仅是商业项目,假设你正在开发一个小型娱乐机械臂来尝试帮你完成桌面上的一些小任务,例如移动茶杯或打开关闭开关。 你的这个机械臂也依赖于一个物体识别系统来识别任务目标。 某次在移动茶杯时,机械臂没有识别到规划路线中有一个接线板,因此茶杯不小心摔倒并且水泼到接线板里引起短路。 幸运的话可能只需要换一个接线板,而不幸的时候甚至可能会引起火灾或电击。 我相信,没有人会想遇到这类突发事件。
-
-因此,无论是在怎样的机器人项目中应用机器学习,我们都必须时刻关注和确保系统的安全性。
-
-### 确保安全性的办法:风险评估和独立的安全系统
-
-#### 风险评估
-
-为了能够确保机器人和机器学习系统的安全性,我们首先要知道可能有哪些危险。 我们可以通过风险评估(Risk Assessment)来做到这一点。
-怎样完成一份风险评估网上已经有很多文章了,我们在这里就不过多的介绍。 我们想要强调的是,对于发现的风险,我们需要尽可能的给出一个避免风险的方案(Risk Mitigation)。 更重要的时,我们需要确保这些方案的具体执行,而不仅仅是流于表面的给出方案就完事。 一份没有执行的方案等于没有方案。
-
-#### 独立的安全系统
-
-在了解了可能有哪些风险之后,我们可以通过设计一个独立的安全系统来规避掉风险中和机器人系统相关的那一部分。
-具体来讲,这个安全系统应该独立于机器学习系统,并且处于机器人架构的底层和拥有足够或最高等级的优先级。 实际上,这个安全系统不应该只针对机器学习系统,而是应该针对整个机器人的方方面面。 或者换句话来说,当开发机器人项目时,必须要有一个足够安全且独立的安全系统。 而针对于机器学习系统的安全性只是这个独立安全系统“足够安全”的部分体现罢了。
-还是以之前的那个物流仓库移动货运机器人为例。 如果机器人的轮子是有独立安全回路并且断电自动刹车的轮子,而机器人又有一个严格符合安全标准且也有安全回路的激光雷达来检测障碍物,同时这个激光雷达的安全回路直接连接至轮子的安全回路。 这样一来,不管机器人是否检测到前方有人或突然有一个人闯入机器人行进路线,激光雷达都会检测到有异物,直接通过独立的安全回路将轮子断电并刹车,以确保不会发生碰撞。 这样一个配置完全独立于任何控制逻辑,从而不受任何上层系统的影响。 **而对于开发者来说,当我们有了一个可靠独立的安全系统,我们也可以放心的去使用最新的突破性技术,而不用担心新技术是否会造成不可预期的后果。**
-
-### 机器学习系统的伦理问题
-
-除了上述讨论到的最根本的安全性问题,机器学习系统的伦理问题也会对机器人的使用造成影响。
-
-例如训练数据集中人种类型不平衡这一类经典的伦理问题。 让我们还是以之前的那个物流仓库移动货运机器人为例。 如果我们的训练数据集只有亚洲人的图片,那么当我们想要开拓海外市场时,我们的海外用户很有可能会发现我们的机器人并不能很好的识别他们的工人。 虽然独立的安全系统可以避免事故的发生,但是急停在工人面前肯定不是一个很好的用户体验。 我们机器人的海外销量也会受到影响。
-
-机器学习系统的伦理问题是目前比较火热的一个讨论领域。作为行业相关人员,我们需要了解这个方向上的最新进展。一方面是在系统设计的初期就把这些问题考虑进去,另一方面也是希望我们的成果能够给更多人带来幸福,而不是带去困扰。
\ No newline at end of file
diff --git a/zh_chapters/chapter_rl_sys/ros.md b/zh_chapters/chapter_rl_sys/ros.md
deleted file mode 100644
index d63311d..0000000
--- a/zh_chapters/chapter_rl_sys/ros.md
+++ /dev/null
@@ -1,74 +0,0 @@
-## 通用机器人操作系统
-
-
-
-:width:`800px`
-
-:label:`ROS2_arch`
-
-在这一章节中,我们来大致了解一下机器人操作系统(ROS)。机器人操作系统(ROS)起源于斯坦福大学人工智能实验室的一个机器人项目。它是一个自由、开源的框架,提供接口、工具来构建先进的机器人。由于机器人领域的快速发展和复杂化,代码复用和模块化的需求日益强烈,ROS适用于机器人这种多节点多任务的复杂场景。目前也有一些机器人、无人机甚至无人车都开始采用ROS作为开发平台。在机器人学习方面,ROS/ROS2可以与深度学习结合,有开发人员为ROS/ROS2开发了的深度学习节点,并支持NVIDIA Jetson和TensorRT。NVIDIA Jetson是NVIDIA为自主机器开发的一个嵌入式系统,包括CPU、GPU、PMIC、DRAM 和闪存的一个模组化系统,可以将自主机器软件运作系统运行速率提升。TensorRT 是由 Nvidia 发布的机器学习框架,用于在其硬件上运行机器学习推理。
-
-作为一个适用于机器人编程的框架,ROS把原本松散的零部件耦合在了一起,为他们提供了通信架构。虽然叫做``操作系统”,ROS更像是一个中间件,给各种基于ROS的应用程序建立起了沟通的桥梁,通过这个中间件,机器人的感知、决策、控制算法可以组织和运行。ROS采用了分布式的设计思想,支持C++、Pyhton等多种编程语言,方便移植。对ROS来讲,最小的进程单元是节点,由节点管理器来管理。参数配置存储在参数服务器中。ROS的通信方式包含:主题(Topic)、服务(Service)、参数服务器(Parameter Server)、动作库(ActionLib)这四种。
-
-ROS提供了很多内置工具,比如三维可视化器rviz,用于可视化机器人、它们工作的环境和传感器数据。它是一个高度可配置的工具,具有许多不同类型的可视化和插件。catkin是ROS 构建系统(类似于Linux下的CMake),Catkin Workspace是创建、修改、编译Catkin软件包的目录。roslaunch可用于在本地和远程启动多个ROS 节点以及在ROS参数服务器上设置参数的工具。此外还有机器人仿真工具Gazebo和移动操作软件和规划框架MoveIt!。ROS为机器人开发者提供了不同编程语言的接口,比如C++语言ROS接口roscpp,python语言的ROS接口rospy。ROS中提供了许多机器人的统一机器人描述格式URDF(Unified Robot Description Format)文件,URDF使用XML格式描述机器人文件。ROS也有一些需要提高的地方,比如它的通信实时性能有限,与工业级要求的系统稳定性还有一定差距。
-
-ROS2项目在ROSCon 2014上被宣布,第一个ROS2发行版 Ardent Apalone 于2017年发布。ROS2增加了对多机器人系统的支持,提高了多机器人之间通信的网络性能,而且支持微控制器和跨系统平台,不仅可以运行在现有的X86和ARM系统上,还将支持MCU等嵌入式微控制器,不止能运行在Linux系统之上,还增加了对Windows、MacOS、RTOS等系统的支持。更重要的是,ROS2还加入了实时控制的支持,可以提高控制的时效性和整体机器人的性能。ROS2的通信系统基于DDS(Data Distribution Service),即数据分发服务,如 :numref:`ROS2_arch`所示。
-
-ROS2依赖于使用shell环境组合工作区。“工作区”(Workspace)是一个ROS术语,表示使用ROS2进行开发的系统位置。核心ROS2 工作区称为Underlay。随后的工作区称为Overlays。使用ROS2进行开发时,通常会同时有多个工作区处于活动状态。接下来我们详细介绍一下ROS2的核心概念。这一部分我们参考了文献 [^1]。
-
-### ROS2节点
-
-ROS Graph是一个由ROS2元素组成的网络,在同一时间一起处理数据。它包括所有的可执行文件和它们之间的联系。ROS2 中的每个节点都应负责一个单一的模块用途(例如,一个节点用于控制车轮马达,一个节点用于控制激光测距仪等)。每个节点都可以通过主题、服务、动作或参数向其他节点发送和接收数据。一个完整的机器人系统由许多协同工作的节点组成。如 :numref:`ros2_graph`。在ROS2中,单个可执行文件(C++程序、Python 程序等)可以包含一个或多个节点。
-
-
-
-:width:`800px`
-
-:label:`ros2_graph`
-
-节点之间的互相发现是通过ROS2底层的中间件实现的,过程总结如下:
-
-- 当一个节点启动后,它会向其他拥有相同ROS域名的节点进行广播,说明它已经上线。其他节点在收到广播后返回自己的相关信息,这样节点间的连接就可以建立了,之后就可以通信了。
-
-- 节点会定时广播它的信息,这样即使它已经错过了最初的发现过程,它也可以和新上线的节点进行连接。
-
-- 节点在下线前它也会广播其他节点自己要下线了。
-
-### ROS2主题
-
-ROS2将复杂系统分解为许多模块化节点。主题(Topics)是 ROS Graph的重要元素,它充当节点交换消息的总线。如 :numref:`ros2\_topics` 所示,一个节点可以向任意数量的主题发布数据,同时订阅任意数量的主题。主题是数据在节点之间以及因此在系统的不同部分之间移动的主要方式之一。
-
-rqt是ROS的一个软件框架,以插件的形式实现了各种 GUI 工具。可以在 rqt 中将所有现有的GUI工具作为可停靠窗口运行。这些工具仍然可以以传统的独立方法运行,但rqt可以更轻松地同时管理屏幕上的所有各种窗口。
-
-
-
-:width:`800px`
-
-:label:`ros2\_topics`
-
-### ROS2服务
-
-服务(Services)是 ROS 图中节点的另一种通信方式。服务基于调用和响应模型,而不是主题的发布者-订阅者模型。虽然主题允许节点订阅数据流并获得持续更新,但服务仅在客户端专门调用它们时才提供数据。节点可以使用ROS2中的服务进行通信。与主题那种单向通信模式中节点发布可由一个或多个订阅者使用的信息的方式不同,服务是客户端向节点发出请求的请求/响应模式提供服务,服务处理请求并生成响应,如 :numref:`ros2\_services`
-
-
-
-:width:`800px`
-
-:label:`ros2\_services`
-
-### ROS2参数
-
-参数(Parameters)是节点的配置值。您可以将参数视为节点设置。节点可以将参数存储为整数、浮点数、布尔值、字符串和列表。在ROS2 中,每个节点都维护自己的参数。
-
-### ROS2动作
-
-动作(Actions)是ROS2中的一种通信类型,适用于长时间运行的任务。它们由三个部分组成:目标、反馈和结果,如 :numref:`ros2\_actions` 所示。动作建立在主题和服务之上。它们的功能类似于服务,除了可以取消动作。它们还提供稳定的反馈,而不是返回单一响应的服务。动作使用客户端-服务器模型,类似于发布者-订阅者模型。”动作客户端”节点将目标发送到”动作服务器”节点,该节点确认目标并返回反馈流和结果。机器人系统可能会使用动作进行导航。动作目标可以告诉机器人前往某个位置。当机器人导航到该位置时,它可以沿途发送更新(即反馈),然后在到达目的地后发送最终结果消息。
-
-
-
-:width:`800px`
-
-:label:`ros2\_actions`
-
-
-[^1]: https://docs.ros.org/en/foxy/Tutorials/Understanding-ROS2-Nodes.html
diff --git a/zh_chapters/chapter_rl_sys/ros_code_ex.md b/zh_chapters/chapter_rl_sys/ros_code_ex.md
deleted file mode 100644
index 38ff756..0000000
--- a/zh_chapters/chapter_rl_sys/ros_code_ex.md
+++ /dev/null
@@ -1,889 +0,0 @@
-## 案例分析:使用机器人操作系统
-
-在这一章节中,我们将带领大家安装ROS2并配置好使用环境,然后再通过一些简单的代码示例来让大家更深入的了解如何使用ROS2和上一章节所介绍的概念。
-
-在本章节以及本章后续的案例章节中,我们将使用ROS2 Foxy Fitzroy(笔者撰写时的最新的ROS2 LTS版本),Ubuntu Focal(20.04)和Ubuntu Focal系统所带的Python 3.8(笔者的Ubuntu Focal所带的是3.8.10)。
-其中ROS2 Foxy Fitzroy和Ubuntu Focal是官方的搭配,而如果你采用debian安装的方式(官方推荐方式)来安装ROS2的话,则Python必须使用Ubuntu所带的Python3版本。
-这是因为debian安装方式会将很多ROS2的Python依赖库以`apt install`(而非`pip install`)的方式安装到Ubuntu自带的Python3路径中去。
-这也就是说,当你选定ROS2版本后,你所需的Ubuntu版本和Python版本也就随之确定了。
-
-如果想要使用Python虚拟环境(virtual env)的话,也必须指定使用Ubuntu系统所带的Python解释器(interpreter),并在创建时加上`site-packages`选项。添加这个选项是因为我们需要那些安装在系统Python3路径中的ROS2的依赖库。
-
-举例来说,对于`pipenv`用户,可以通过下面这条命令来创建一个使用系统Python3并添加了`site-packages`的虚拟环境。
-
-```shell
-pipenv --python $(/usr/bin/python3 -V | cut -d" " -f2) --site-packages
-```
-
-因为要使用系统Python3的原因,用`conda`创建的虚拟环境可能会出现各种不兼容的问题。
-
-对于其它版本的ROS2,安装过程和使用方式基本相同。
-
-在本章节以及本章后续的案例章节中,我们在合适的场合将用ROS2,Ubuntu和Python来分别指代ROS2 Foxy Fitzroy,Ubuntu Focal和Ubuntu Focal所带的Python 3.8。
-
-本章节中的案例有参考ROS2的官方教程。这个官方教程讲解的非常详细,非常适合初学者入门ROS2。
-
-### 安装ROS2 Foxy Fitzroy
-
-在Ubuntu上安装ROS2相对简单,绝大多数情况跟随官方教程安装即可。
-
-#### 系统区域(locale)需要支持UTF-8
-
-在开始安装之前,我们需要先确保我们Ubuntu系统的区域(locale)已经设置成了支持UTF-8的值。
-我们可以通过`locale`命令来查看目前的区域(locale)设置。
-如果`LANG`的值是以`.UTF-8`结尾的话,则代表系统已经是支持UTF-8的区域(locale)设置了。
-否则,可以使用下面的命令来将系统的区域(locale)设置为支持UTF-8的美式英语。
-想设置成其它语言只需更改相应的语言代码即可。
-
-```shell
-sudo apt update && sudo apt install locales
-sudo locale-gen en_US en_US.UTF-8
-sudo update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8
-export LANG=en_US.UTF-8
-```
-
-#### 设置软件源
-
-我们还需要将ROS2的软件源加入到系统中。我们可以通过下面这些命令完成这点。
-
-```shell
-sudo apt update && sudo apt install curl gnupg2 lsb-release
-sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg
-
-echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(source /etc/os-release && echo $UBUNTU_CODENAME) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null
-```
-
-#### 安装ROS2
-
-现在我们可以开始安装ROS2了。我们可以先更新软件源缓存,然后再安装ROS2 Desktop版。这个版本包含了ROS2框架和大部分ROS2开发常用的软件库,如RViz等,因此是首选的版本。
-
-```shell
-sudo apt update
-sudo apt install ros-foxy-desktop
-```
-
-另外,让我们再来安装两个额外的软件,`colcon`和`rosdep`。前者是ROS2的编译工具,后者可以帮助我们迅速安装一个ROS2工程所需的依赖库。
-
-```shell
-sudo apt-get install python3-colcon-common-extensions python3-rosdep
-```
-
-到此,我们已经安装好了ROS2。但是,如果想要使用它,我们还需要一个额外的环境设置步骤。
-
-#### 环境设置
-
-对于任意安装好的ROS2(和ROS)版本,我们需要source对应的setup脚本来为对应的版本设置好所需环境,然后才能开始使用其版本。
-
-例如,对于刚安装好的ROS2 Foxy Fitzroy,我们可以在终端中执行下面的命令来设置好ROS2所需的环境。
-
-```shell
-source /opt/ros/foxy/setup.bash
-```
-
-如果你用的是bash以外的shell,你可以尝试将setup的文件扩展名改为对应shell的名字。例如zsh的用户可以尝试使用`source /opt/ros/foxy/setup.zsh`命令。
-
-如果你不想每次使用ROS2之前都要输入上述命令,可以尝试将这条命令加入到你的`.bashrc`文件中去(或者是`.zshrc`或其它对应的shell文件)。这样,你以后的每个新命令行终端都会自动设置到ROS2所需的环境。
-
-这种环境设置方式的好处在于你可以放心的安装多个不同版本的ROS2(和ROS),然后只需在需要时`source`对应版本的`setup.bash`文件,从而使用这个版本的ROS2并不受其它版本的干扰。
-
-如果你是一个Python的重度用户,上面这种将`setup.bash`加入到`.bashrc`的方式可能会对你造成一些困扰。因为你的所有virtual env从此都会自动引入ROS2的环境设置,并且ROS2所包含的python libraries也会加入到你的virtual env的路径里面去。
-我相信,你可能对于virtual env会检测到ROS2的库这种情况不会感到特别开心,即使这些库并不会被用到或破坏你virtual env中程序的运行。
-
-解决这个问题的方法也很简单。当你准备主要用Python来开发一个ROS2项目时,你可以为这个项目新建一个virtual env,然后将`source /opt/ros/foxy/setup.bash`这条命令加入到这个virtual env的`activate`脚本中去。
-
-注意!你可能需要将这条`source`命令添加到脚本结尾前一些的位置或脚本最开头,要不然当你进入(activate)virtual env时你有可能会遇到下面这个错误(例如,对于`pipenv`的用户就需要添加到脚本结尾处的`hash -r 2>/dev/null`这条命令之前而不是最末尾)。
-
-```shell
-Shell for UNKNOWN_VIRTUAL_ENVIRONMENT already activated.
-No action taken to avoid nested environments.
-```
-
-#### 测试安装成功
-
-当我们执行了上述的`source`命令之后,我们可以测试ROS2的安装以及环境设置时成功的。
-
-我们只需在执行了`source`命令的命令行中执行`printenv | grep -i ^ROS`。输出的结果应该包含以下三个环境变量。
-
-```shell
-ROS_VERSION=2
-ROS_PYTHON_VERSION=3
-ROS_DISTRO=foxy
-```
-
-此外,我们可以新开两个执行了`source`命令的终端窗口,然后分别执行以下两条命令。
-
-终端1:
-```shell
-ros2 run demo_nodes_cpp talker
-```
-
-终端2:
-```shell
-ros2 run demo_nodes_py listener
-```
-
-如果成功安装并执行了`source`命令的话,我们将会看到`talker`显示它正在发布消息,同时`listener`显示它听到了这些消息。
-
-恭喜!您已经成功安装好了ROS2并配置到了环境。下面我们将会通过几个简单的案例来展示上章节中介绍过的ROS2的核心概念。
-
-### ROS2节点和Hello World
-
-在这一小节中,我们将会创建一个ROS2项目,并使用Python来编写一个Hello World案例,以便展示ROS2 Node的基本结构。
-
-#### 新建一个ROS2项目
-
-首先,在一个合适的位置新建一个文件夹。这个文件夹将是我们ROS2项目的根目录,同时也是上一章节中介绍过的“工作区”(Workspace)。这个工作区是我们自己创建的,所以它是一个Overlay Workspace。相对的,我们之前执行的`source`命令会帮我们准备好这个Overlay所基于的核心工作区(Underlay Workspace)。
-
-假设我们创建了名为`openmlsys-ros2`的工作区。
-
-```shell
-mkdir openmlsys-ros2
-cd openmlsys-ros2
-```
-
-然后让我们为这个工作区创建一个Python的虚拟环境(virtual env)并依照上面*环境设置*小节中所介绍的那样将`source`命令添加到虚拟环境对应的`activate`脚本中去。
-
-**我们默认之后所有案例章节的命令都是在这个新建的虚拟环境中执行的。**
-
-不同的虚拟环境管理工具会有不同的指令,因此这一步笔者没有提供可执行命令的示例,而是留给读者自行处理。
-
-接下来,我们要在这个工作区文件夹内新建一个名为`src`的子文件夹。在这个子文件夹内,我们将会创建不同的ROS2的程序库(package)。这些程序库相互独立,但又会互相调用其他库的功能来达成整个ROS2项目想要达成的各种目的。
-
-在创建好`src`文件夹后,我们可以尝试调用`colcon build`命令。`colcon`是ROS2项目常用的一个编译工具(build tool)。这个命令会尝试编译整个ROS2项目(即目前工作区内的所有的程序库)。在成功运行完命令后,我们可以发现工作区内多出了三个新文件夹:`build`,`install`和`log`。其中`build`内是编译过程的中间产物,`install`内是编译的最终产物(即编译好的库),而`log`内是编译过程的日志。
-
-到此,我们已经新建好了一个ROS2项目的框架,可以开始编写具体的代码了。
-
-#### 新建一个ROS2框架下的Python库
-
-下面,让我们在`src`文件夹内新建一个ROS2的程序库。我们将在这个程序库内编写我们的Hello World案例。
-
-```shell
-cd src
-ros2 pkg create --build-type ament_python --dependencies rclpy std_msgs --node-name hello_world_node my_hello_world
-```
-
-`ros2`命令的`pkg create`子项可以帮助我们快速的创建一个ROS2程序库的框架。`build-type`参数指明了这是一个纯Python库,`dependencies`参数指明了这个库将会使用`rclpy`和`std_msgs`这两个依赖库,`node-name`参数指明了我们创建的程序库中会有一个名为hello_world_node的ROS2节点,而最后的`my_hello_world`则是新建程序库的名字。
-
-进入新建好的程序库文件夹`my_hello_world`,我们可以看到刚运行的命令已经帮我们建好一个Python库文件夹`my_hello_world`。其与程序库同名,且内含`__init__.py`文件和`hello_world_node.py`文件。后者的存在是由于我们使用了`node_name`参数的原因。我们将在这个Python库文件夹内编写我们的Python代码。
-
-除此之外,还有`resource`和`test`这两个文件夹。前者帮助ROS2来定位Python程序库,因此我们不需要管它。后者用来包含所有的测试代码,并且我们可以看到里面已经有了三个测试文件。
-
-除了这三个文件夹外,还有三个文件,`package.xml`,`setup.cfg`和`setup.py`。
-
-`package.xml`是ROS2程序库的标准配置文件。打开后我们可以发现很多内容已经预生成好了,但是我们还需填写或更新`version`,`description`,`maintainer`和`license`这几项的内容。在此笔者推荐大家每次新建一个ROS2库的时候都第一时间将这些信息补全。除了这些项,我们还能看到`rclpy`和`std_msgs`已经被列为依赖库了,这是因为我们使用了`dependencies`参数的原因。如果我们要添加或修改依赖库,可以直接在`package.xml`内的`depend`列表处修改。除了最常用的`depend`(同时针对build,export和execution),我们还有`build_depend`,`build_export_depend`,`exec_depend`,`test_depend`,`buildtool_depend`和`dec_depend`。关于`package.xml`的具体介绍可以参考此英文[Wiki Page](http://wiki.ros.org/catkin/package.xml)。
-
-`setup.cfg`和`setup.py`都是Python库的相关文件,但是ROS2也会通过这两个文件来了解怎么安装这个Python库至`install`文件夹以及有哪些需要注册的entry points,即可以直接用ROS2命令行命令来直接调用的程序。我们可以看到在`setup.py`中的`entry_points`项的`console_scripts`子项中已经将`hello_world_node`这个名字设置为`my_hello_world/hello_world_node.py`这个Python文件中`main()`函数的别名。我们后续就可以使用ROS2命令行命令和这个名字来直接调用这个函数。具体方式如下:
-
-```shell
-# ros2 run