Недавно я познакомился с исходным кодом Pytorch и использовал свое свободное время, чтобы прочитать и прочитать его. После его прочтения у меня впервые появилось новое понимание Pytorch.
Оказывается, территория Пайторча сейчас очень велика, и Пайторч уже не тот Пайторч, каким был год назад.
После интеграции Caffe2,Pytorch начал превращаться в бегемота,То, что здесь происходит, далеко не сравнимо с предыдущим кафе.,Суммируя,У Пайторча есть чему поучиться,В этой статье кратко рассказывается о некоторых дополнительных знаниях о Pytorch.,Давайте своими руками компилируем при использовании Pytorch, вместо того, чтобы действовать вслепую.,Но приходите с целью и выбором.
Статьи по теме, написанные ранее, также можно использовать в качестве справочного материала:
Экология Пайторча:
Среди них есть собственные библиотеки Пайторча и кооперативная.,Это можно увидетьFaceBookОчень амбициозный,Но хорошо это или плохо для нас?,СуммируянадеятьсяFBВыделите больше рабочей силы для его полировкиPytorchБар。
компилировать Первое, что нужно сделать, это Получить исходный код。
отчиновникПолучить исходный код — лучший способ,отPytorchизофициальный сайт github可以下载最新из代码。
помнить,отчиновник克隆最新из代码из时候要加入recursive
Этот параметр,Потому что сам Pytorch требует для участия множество сторонних библиотек:
git clone --recursive https://github.com/pytorch/pytorch
Конечно, вы также можете загрузить исходный код предыдущей стабильной версии из интерфейса выпуска. Если мы напрямую загружаем официальный пакет исходного кода или официальный пакет выпуска, нам необходимо выполнить его после загрузки.
git submodule update --init --recursive
Приведенная выше команда предназначена для загрузки и обновления сторонней библиотеки.,Нам необходимо убедиться, что все необходимые сторонние библиотеки загружены.,В противном случае процесс будет прерван.
Далее идет Pytorch Исходный. развернутый кодпак Структура каталогов (показаны только некоторые основные папки), среди которых основными являются Исходный все коды находятся в папках, показанных ниже:
Среди них несколько важных основных библиотек отмечены красными стрелками. Вот краткое введение:
основная папка В основномc10、aten、torch、caffe2.
Зачем ставить с10 спереди?
потому чточиновник Уже указаноc10目录是最重要из源代码папка,То есть почти весь исходный код связан с кодом здесь, например, с нашим определением типа.,Pytorch最重要изTensorиз内存分配方式ждатьждать,все в этой папке,чиновник тоже это сказал,Позже код в Aten будет постепенно перемещаться в эту папку.,Другими словами, эта папка будет содержать основной код Pytorch.
иAtenВ папке находятся некоторые реализацииTensorиз底层(иc10похожий),Он также включает в себя множество кода прямого и обратного уровней (например, код прямых и обратных операций сверточного уровня), включая стороны ЦП и графического процессора.,Суммируя ВсеC++из核心操作代码。
torchПапки одинаково важны,В основном он содержит некоторые рабочие функции немного более высокого уровня.,Напримерtorch.onesждать,Есть стороны C++ и Python.,Также включает основной код Python и код-оболочку.,Если мы используем версию Pytorch для Python,Контакт с этими кодами относительно тесный.
иCaffe2Излишне говорить,caffe2 разработал множество оптимизированных кодов операций, в основном для мобильных терминалов.,Код для объединения моделей, количественной оценки модели и т. д.,Его бэкэнд включает QNNPACK и некоторые другие базовые вычислительные библиотеки для мобильных терминалов (некоторые разработчики говорят, что GLOW также рассматривается в бэкэнде caffe2).
PytorchВедь этоБольшойиз深度学习库,Поэтому требуется множество зависимых библиотек.,其中有很多我们耳熟能详из数值计算库(eigen、gemmlowp)、Библиотека преобразования моделей (onnx、onnx-tensorrt)、Библиотека параллельного обучения (gloo、nccl)、Собственная библиотека реализации нижнего уровня (QNNPACK) и ряд зависимых библиотек, таких как pybind11, которые связывают сторону Python.
Конечно, библиотек много, поэтому я не буду здесь описывать их по отдельности.,Суммируя,Когда мы были в компилировании,Компилируемый код Pytorch будет использоваться в соответствии с нашими настройками при компиляции.,Автоматически определять, существуют ли в текущей системе необходимые сторонние библиотеки. Если ее нет, используйте стороннюю библиотеку здесь (напрямую скомпилировать и использовать диаманте сторонней библиотеки),Вот почему нам нужно выполнитьgit submodule update --init --recursive
Чтобы загрузить зависимую третью библиотеку Исходный причина кода.
toolsэтотпапка中из内容到底是做什么из,Взгляните кратко на введение чиновника:
This folder contains a number of scripts which are used as
part of the PyTorch build process. This directory also doubles
as a Python module hierarchy (thus the `__init__.py`).
Он содержит некоторый инструмент для генерации кода скрипта (с использованием Python).、Скрипт и коды для некоторых компонентов компиляции, а также некоторые инструменты, необходимые разработчикам.、а такжеAMDПомощь по видеокартекомпилировать代码и一些特殊情况需要использоватьизинструментждать。в наскомпилироватьPytorchИсходный Код из этой папки будет использоваться в процессе кодирования.
Нужно объяснить одну вещь,То есть Pytorch использует много генерации кода.,Например操作层函数из头文件
NativeFunction.h
ждать,Поэтому генерация кода Скрипт в инструментах по-прежнему относительно важна.
提一个可能会использовать到из Скриптbuild_pytorch_libs.sh
,этот Скриптиспользуется длякомпилироватьбиблиотека libtorchиз,Libtorch — это библиотека Pytorch, использующая C++, которая не требует упаковки Python.,Удобен для использования на этапе развертывания.
оlibtorchиз具体介绍и简单использовать可以看这里:Используйте интерфейс C++ Pytorch (libtorch) для считывания предварительно обученных весов и составления прогнозов.。
Я не буду подробно описывать файлы в инструментах.,大家可以看一下其中изreadme
。
Про другие папки говорить особо нечего, они не очень важны по сравнению с вышеперечисленными.
компилировать Главное событие приближается,В процессе компиляции вы можете столкнуться с различными проблемами.,Но на самом деле, пока мы правильно подготавливаем окружающую среду,Большинство из них можно использовать за один раз:
Метод установки Python создан не только с использованием Cmake.,Вместо этого он создается путем объединения инструментов настройки на стороне Python с cmake.,Проект Pytorch по-прежнему относительно велик.,Таким образом, код компиляции тоже длинный.,Давайте в основном посмотрим на переменные среды в процессе компиляции:
# Environment variables you are probably interested in:
#
# DEBUG
# build with -O0 and -g (debug symbols)
#
# REL_WITH_DEB_INFO
# build with optimizations and -g (debug symbols)
#
# MAX_JOBS
# maximum number of compile jobs we should use to compile your code
#
# NO_CUDA
# disables CUDA build
#
# ....
# ....
#
# Environment variables for feature toggles:
#
# NO_CUDNN
# disables the cuDNN build
#
# NO_FBGEMM
# disables the FBGEMM build
#
# NO_TEST
# disables the test build
#
# NO_MIOPEN
# disables the MIOpen build
Этикомпилировать变量根据我们из需要在执行python setup.py install
использовать,Если вы не хотите компилировать CUDA,ноNO_CUDA=1 python setup.py install
.
Выполнив приведенный выше оператор, мы можем выполнить компиляцию.
Ниндзя может значительно ускорить компиляцию,Более того, информация об ошибках, предлагаемая в процессе компиляции, является более полной и подробной.,如果我们想использоватьninjaПриходитькомпилировать,那么直接在当前изpythonсредаpip install ninja
Вот и все。
Установщик Pytorch автоматически будет искать ниндзя в текущей среде.,если таковые имеются,Затем сначала используйте ninja для компиляции.
Устанавливать только библиотеку libtorch:создаватьbuildпапка,выполнить внутриpython ../tools/build_libtorch.py
Режим разработчика:python setup.py build develop
(верноPythonразвитие помогает)
По умолчанию, когда мы устанавливаем Pytorch, вместе с ним идет caffe2 (конечно, вы можете не устанавливать caffe2, но при выполнении некоторых конкретных операций свертки будет сообщаться об ошибке~), поэтому после успешной установки мы не должны только проверьте, успешно ли установлен Pytorch, но также проверьте, успешно ли установлен caffe2.
Проверьте, прошла ли установка Pytorch успешно:
>>> import torch
>>> print(torch.cuda.is_available())
>>> print(torch.backends.cudnn.is_acceptable(torch.cuda.FloatTensor(1)))
... print(torch.backends.cudnn.version())```
True # Появится очередь, указывающая, что cuda в норме
Ture # Появляется Туре, указывая, что cudnn в норме.
7401 # Это номер моей версии
Во время установкиcaffe2из环境下运行pythonи импортироватьcaffe2.python
,Если загрузка прошла успешно, установка прошла успешно. Если импорт не может быть успешным,Вы можете сначала проверить сообщение об ошибке,Скорее всего какие-то мелкие ошибки,Например:
Python 3.6.6 |Anaconda, Inc.| (default, Oct 9 2018, 12:34:16)
[GCC 7.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from caffe2.python import core
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/prototype/anaconda3/envs/pytorch-dev/lib/python3.6/site-packages/caffe2/python/__init__.py", line 2, in <module>
from caffe2.proto import caffe2_pb2
File "/home/prototype/anaconda3/envs/pytorch-dev/lib/python3.6/site-packages/caffe2/proto/caffe2_pb2.py", line 6, in <module>
from google.protobuf.internal import enum_type_wrapper
ModuleNotFoundError: No module named 'google'
上方из导入出错是потому что当期из虚拟环境没有安装protobuf
,Простое выполнение командpip install protobuf
Вот и все,При других подобных ошибках просто установите соответствующую библиотеку согласно сообщению об ошибке.
в случае успехаimport
но不会出现报错信息:
Python 3.6.6 |Anaconda, Inc.| (default, Oct 9 2018, 12:34:16)
[GCC 7.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from caffe2.python import core
>>>
в случае Исходный код安装изPytorch,Для удаления необходимо выполнить:
pip uninstall torch
python setup.py clean
Если вы столкнулись с проблемой, что build.ninja не может быть найден,можешь попробовать переустановить ниндзя,Или не использовать Просто ниндзя.
Если ваш cmake сообщает о следующей ошибке:
CMake Error at aten/src/ATen/CMakeLists.txt:225 (add_subdirectory):
The source directory
/home/prototype/Downloads/pytorch/third_party/sleef
does not contain a CMakeLists.txt file.
CMake Error at aten/src/ATen/CMakeLists.txt:226 (set_property):
set_property could not find TARGET sleef. Perhaps it has not yet been
created.
иллюстрироватькомпилировать Исходный код所需要из第三方库没有下载好,В это время необходимо выполнитьgit submodule update --init --recursive
Приходить更新第三方库源,Просто скачайте нашу стороннюю библиотеку.
Научить человека ловить рыбу хуже, чем научить его ловить рыбу,Лучший адрес для запроса компиляционных проблем — это интерфейс задач GITHUB.,Просто вставьте проблему, с которой вы столкнулись, и запросите ее.,По сути, все проблемы, с которыми вы сталкиваетесь, с которыми сталкивались другие, находятся здесь.
https://pytorch.org/blog/a-tour-of-pytorch-internals-1/
https://github.com/pytorch/pytorch/blob/master/CONTRIBUTING.md