From 4aa3296739ae66917bf1c1cb242c22633026bede Mon Sep 17 00:00:00 2001 From: Nikita Titov Date: Thu, 12 Oct 2017 16:34:23 +0400 Subject: [PATCH] [docs] documentation improvement (#976) * fixed typos and hotfixes * converted gcc-tips.Rmd; added ref to gcc-tips * renamed files * renamed Advanced-Topics * renamed README * renamed Parameters-Tuning * renamed FAQ * fixed refs to FAQ * fixed undecodable source characters * renamed Features * renamed Quick-Start * fixed undecodable source characters in Features * renamed Python-Intro * renamed GPU-Tutorial * renamed GPU-Windows * fixed markdown * fixed undecodable source characters in GPU-Windows * renamed Parameters * fixed markdown * removed recommonmark dependence * hotfixes * added anchors to links * fixed 404 * fixed typos * added more anchors * removed sphinxcontrib-napoleon dependence * removed outdated line in Travis config * fixed max-width of the ReadTheDocs theme * added horizontal align to images --- .travis/test.sh | 7 +- R-package/R/lgb.cv.R | 2 +- R-package/R/lgb.train.R | 2 +- README.md | 14 +- docs/Advanced-Topic.md | 34 - docs/Advanced-Topics.rst | 59 ++ ...{development.rst => Development-Guide.rst} | 8 +- docs/FAQ.md | 138 ---- docs/FAQ.rst | 175 +++++ docs/Features.md | 183 ----- docs/Features.rst | 273 +++++++ docs/GPU-Performance.rst | 5 +- docs/GPU-Targets.rst | 53 +- docs/GPU-Tutorial.md | 179 ----- docs/GPU-Tutorial.rst | 196 +++++ docs/GPU-Windows.md | 450 ----------- docs/GPU-Windows.rst | 565 ++++++++++++++ docs/Installation-Guide.rst | 20 +- docs/Parallel-Learning-Guide.rst | 48 +- docs/Parameters-Tuning.rst | 80 ++ docs/Parameters-tuning.md | 47 -- docs/Parameters.md | 374 --------- docs/Parameters.rst | 730 ++++++++++++++++++ docs/Python-Intro.rst | 222 ++++++ docs/Python-intro.md | 206 ----- docs/Quick-Start.md | 118 --- docs/Quick-Start.rst | 219 ++++++ docs/README.md | 14 - docs/README.rst | 16 + docs/_static/images/gcc-bars.png | Bin 0 -> 61927 bytes docs/_static/images/gcc-chart.png | Bin 0 -> 85809 bytes docs/_static/images/gcc-comparison-1.png | Bin 0 -> 28801 bytes docs/_static/images/gcc-comparison-2.png | Bin 0 -> 38915 bytes docs/_static/images/gcc-meetup-1.png | Bin 0 -> 65764 bytes docs/_static/images/gcc-meetup-2.png | Bin 0 -> 53838 bytes docs/_static/images/gcc-table.png | Bin 0 -> 135557 bytes docs/_static/js/rst_links_fix.js | 8 +- docs/conf.py | 49 +- docs/gcc-Tips.rst | 51 ++ docs/gcc-tips.Rmd | 35 - docs/index.rst | 8 +- docs/requirements.txt | 4 - python-package/README.rst | 2 +- 43 files changed, 2692 insertions(+), 1902 deletions(-) delete mode 100644 docs/Advanced-Topic.md create mode 100644 docs/Advanced-Topics.rst rename docs/{development.rst => Development-Guide.rst} (96%) delete mode 100644 docs/FAQ.md create mode 100644 docs/FAQ.rst delete mode 100644 docs/Features.md create mode 100644 docs/Features.rst delete mode 100644 docs/GPU-Tutorial.md create mode 100644 docs/GPU-Tutorial.rst delete mode 100644 docs/GPU-Windows.md create mode 100644 docs/GPU-Windows.rst create mode 100644 docs/Parameters-Tuning.rst delete mode 100644 docs/Parameters-tuning.md delete mode 100644 docs/Parameters.md create mode 100644 docs/Parameters.rst create mode 100644 docs/Python-Intro.rst delete mode 100644 docs/Python-intro.md delete mode 100644 docs/Quick-Start.md create mode 100644 docs/Quick-Start.rst delete mode 100644 docs/README.md create mode 100644 docs/README.rst create mode 100644 docs/_static/images/gcc-bars.png create mode 100644 docs/_static/images/gcc-chart.png create mode 100644 docs/_static/images/gcc-comparison-1.png create mode 100644 docs/_static/images/gcc-comparison-2.png create mode 100644 docs/_static/images/gcc-meetup-1.png create mode 100644 docs/_static/images/gcc-meetup-2.png create mode 100644 docs/_static/images/gcc-table.png create mode 100644 docs/gcc-Tips.rst delete mode 100644 docs/gcc-tips.Rmd delete mode 100644 docs/requirements.txt diff --git a/.travis/test.sh b/.travis/test.sh index 40ab63bbd..1b692f044 100644 --- a/.travis/test.sh +++ b/.travis/test.sh @@ -28,13 +28,12 @@ cd $TRAVIS_BUILD_DIR if [[ ${TASK} == "check-docs" ]]; then cd docs sudo apt-get install linkchecker - pip install rstcheck # html5validator - pip install -r requirements.txt + pip install rstcheck sphinx sphinx_rtd_theme # html5validator rstcheck --report warning --ignore-directives=autoclass,autofunction `find . -type f -name "*.rst"` || exit -1 make html || exit -1 find ./_build/html/ -type f -name '*.html' -exec \ - sed -i -e 's#\(\.\/[^.]*\.\)\(md\|rst\)#\1html#g' {} \; # Emulate js function -# html5validator --root ./_build/html/ || exit -1 For future (Sphinx 1.6) usage + sed -i -e 's;\(\.\/[^.]*\.\)rst\([^[:space:]]*\);\1html\2;g' {} \; # Emulate js function +# html5validator --root ./_build/html/ || exit -1 linkchecker --config=.linkcheckerrc ./_build/html/*.html || exit -1 exit 0 fi diff --git a/R-package/R/lgb.cv.R b/R-package/R/lgb.cv.R index d85e6340c..6d73048b0 100644 --- a/R-package/R/lgb.cv.R +++ b/R-package/R/lgb.cv.R @@ -57,7 +57,7 @@ CVBooster <- R6Class( #' If early stopping occurs, the model will have 'best_iter' field #' @param callbacks list of callback functions #' List of callback functions that are applied at each iteration. -#' @param ... other parameters, see parameters.md for more informations +#' @param ... other parameters, see Parameters.rst for more informations #' #' @return a trained model \code{lgb.CVBooster}. #' diff --git a/R-package/R/lgb.train.R b/R-package/R/lgb.train.R index a1fa2d8b9..1efd677f2 100644 --- a/R-package/R/lgb.train.R +++ b/R-package/R/lgb.train.R @@ -30,7 +30,7 @@ #' @param reset_data Boolean, setting it to TRUE (not the default value) will transform the booster model into a predictor model which frees up memory and the original datasets #' @param callbacks list of callback functions #' List of callback functions that are applied at each iteration. -#' @param ... other parameters, see parameters.md for more informations +#' @param ... other parameters, see Parameters.rst for more informations #' #' @return a trained booster model \code{lgb.Booster}. #' diff --git a/README.md b/README.md index 23bcfd950..a7d031c8e 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ LightGBM is a gradient boosting framework that uses tree based learning algorith - Parallel and GPU learning supported - Capable of handling large-scale data -For more details, please refer to [Features](https://github.com/Microsoft/LightGBM/blob/master/docs/Features.md). +For more details, please refer to [Features](https://github.com/Microsoft/LightGBM/blob/master/docs/Features.rst). [Comparison experiments](https://github.com/Microsoft/LightGBM/blob/master/docs/Experiments.rst#comparison-experiment) on public datasets show that LightGBM can outperform existing boosting frameworks on both efficiency and accuracy, with significantly lower memory consumption. What's more, the [parallel experiments](https://github.com/Microsoft/LightGBM/blob/master/docs/Experiments.rst#parallel-experiment) show that LightGBM can achieve a linear speed-up by using multiple machines for training in specific settings. @@ -36,7 +36,7 @@ News 05/03/2017 : LightGBM v2 stable release. -04/10/2017 : LightGBM supports GPU-accelerated tree learning now. Please read our [GPU Tutorial](./docs/GPU-Tutorial.md) and [Performance Comparison](./docs/GPU-Performance.rst). +04/10/2017 : LightGBM supports GPU-accelerated tree learning now. Please read our [GPU Tutorial](./docs/GPU-Tutorial.rst) and [Performance Comparison](./docs/GPU-Performance.rst). 02/20/2017 : Update to LightGBM v2. @@ -62,22 +62,22 @@ JPMML: https://github.com/jpmml/jpmml-lightgbm Get Started and Documentation ----------------------------- -Install by following the [guide](https://github.com/Microsoft/LightGBM/blob/master/docs/Installation-Guide.rst) for the command line program, [Python-package](https://github.com/Microsoft/LightGBM/tree/master/python-package) or [R-package](https://github.com/Microsoft/LightGBM/tree/master/R-package). Then please see the [Quick Start](https://github.com/Microsoft/LightGBM/blob/master/docs/Quick-Start.md) guide. +Install by following the [guide](https://github.com/Microsoft/LightGBM/blob/master/docs/Installation-Guide.rst) for the command line program, [Python-package](https://github.com/Microsoft/LightGBM/tree/master/python-package) or [R-package](https://github.com/Microsoft/LightGBM/tree/master/R-package). Then please see the [Quick Start](https://github.com/Microsoft/LightGBM/blob/master/docs/Quick-Start.rst) guide. Our primary documentation is at https://lightgbm.readthedocs.io/ and is generated from this repository. Next you may want to read: * [**Examples**](https://github.com/Microsoft/LightGBM/tree/master/examples) showing command line usage of common tasks -* [**Features**](https://github.com/Microsoft/LightGBM/blob/master/docs/Features.md) and algorithms supported by LightGBM -* [**Parameters**](https://github.com/Microsoft/LightGBM/blob/master/docs/Parameters.md) is an exhaustive list of customization you can make -* [**Parallel Learning**](https://github.com/Microsoft/LightGBM/blob/master/docs/Parallel-Learning-Guide.rst) and [**GPU Learning**](https://github.com/Microsoft/LightGBM/blob/master/docs/GPU-Tutorial.md) can speed up computation +* [**Features**](https://github.com/Microsoft/LightGBM/blob/master/docs/Features.rst) and algorithms supported by LightGBM +* [**Parameters**](https://github.com/Microsoft/LightGBM/blob/master/docs/Parameters.rst) is an exhaustive list of customization you can make +* [**Parallel Learning**](https://github.com/Microsoft/LightGBM/blob/master/docs/Parallel-Learning-Guide.rst) and [**GPU Learning**](https://github.com/Microsoft/LightGBM/blob/master/docs/GPU-Tutorial.rst) can speed up computation * [**Laurae++ interactive documentation**](https://sites.google.com/view/lauraepp/parameters) is a detailed guide for hyperparameters Documentation for contributors: * [**How we Update readthedocs.io**](https://github.com/Microsoft/LightGBM/blob/master/docs/README.md) -* Check out the [Development Guide](https://github.com/Microsoft/LightGBM/blob/master/docs/development.rst). +* Check out the [Development Guide](https://github.com/Microsoft/LightGBM/blob/master/docs/Development-Guide.rst). Support ------- diff --git a/docs/Advanced-Topic.md b/docs/Advanced-Topic.md deleted file mode 100644 index 850be77fd..000000000 --- a/docs/Advanced-Topic.md +++ /dev/null @@ -1,34 +0,0 @@ -# Advanced Topics - -## Missing Value Handle - -* LightGBM enables the missing value handle by default, you can disable it by set ```use_missing=false```. -* LightGBM uses NA (NAN) to represent the missing value by default, you can change it to use zero by set ```zero_as_missing=true```. -* When ```zero_as_missing=false``` (default), the unshown value in sparse matrices (and LightSVM) is treated as zeros. -* When ```zero_as_missing=true```, NA and zeros (including unshown value in sparse matrices (and LightSVM)) are treated as missing. - -## Categorical Feature Support - -* LightGBM can offer a good accuracy when using native categorical features. Not like simply one-hot coding, LightGBM can find the optimal split of categorical features. Such an optimal split can provide the much better accuracy than one-hot coding solution. -* Use `categorical_feature` to specify the categorical features. Refer to the parameter `categorical_feature` in [Parameters](./Parameters.md). -* Converting to `int` type is needed first, and there is support for non-negative numbers only. It is better to convert into continues ranges. -* Use `max_cat_group`, `cat_smooth_ratio` to deal with over-fitting (when #data is small or #category is large). -* For categorical features with high cardinality (#category is large), it is better to convert it to numerical features. - -## LambdaRank - -* The label should be `int` type, and larger numbers represent the higher relevance (e.g. 0:bad, 1:fair, 2:good, 3:perfect). -* Use `label_gain` to set the gain(weight) of `int` label. -* Use `max_position` to set the NDCG optimization position. - -## Parameters Tuning - -* Refer to [Parameters Tuning](./Parameters-tuning.md). - -## GPU Support - -* Refer to [GPU Tutorial](./GPU-Tutorial.md) and [GPU Targets](./GPU-Targets.rst). - -## Parallel Learning - -* Refer to [Parallel Learning Guide](./Parallel-Learning-Guide.rst). diff --git a/docs/Advanced-Topics.rst b/docs/Advanced-Topics.rst new file mode 100644 index 000000000..eebad3cdc --- /dev/null +++ b/docs/Advanced-Topics.rst @@ -0,0 +1,59 @@ +Advanced Topics +=============== + +Missing Value Handle +-------------------- + +- LightGBM enables the missing value handle by default, you can disable it by set ``use_missing=false``. + +- LightGBM uses NA (NaN) to represent the missing value by default, you can change it to use zero by set ``zero_as_missing=true``. + +- When ``zero_as_missing=false`` (default), the unshown value in sparse matrices (and LightSVM) is treated as zeros. + +- When ``zero_as_missing=true``, NA and zeros (including unshown value in sparse matrices (and LightSVM)) are treated as missing. + +Categorical Feature Support +--------------------------- + +- LightGBM can offer a good accuracy when using native categorical features. Not like simply one-hot coding, LightGBM can find the optimal split of categorical features. + Such an optimal split can provide the much better accuracy than one-hot coding solution. + +- Use ``categorical_feature`` to specify the categorical features. + Refer to the parameter ``categorical_feature`` in `Parameters <./Parameters.rst>`__. + +- Converting to ``int`` type is needed first, and there is support for non-negative numbers only. + It is better to convert into continues ranges. + +- Use ``max_cat_group``, ``cat_smooth_ratio`` to deal with over-fitting + (when ``#data`` is small or ``#category`` is large). + +- For categorical features with high cardinality (``#category`` is large), it is better to convert it to numerical features. + +LambdaRank +---------- + +- The label should be ``int`` type, and larger numbers represent the higher relevance (e.g. 0:bad, 1:fair, 2:good, 3:perfect). + +- Use ``label_gain`` to set the gain(weight) of ``int`` label. + +- Use ``max_position`` to set the NDCG optimization position. + +Parameters Tuning +----------------- + +- Refer to `Parameters Tuning <./Parameters-Tuning.rst>`__. + +Parallel Learning +----------------- + +- Refer to `Parallel Learning Guide <./Parallel-Learning-Guide.rst>`__. + +GPU Support +----------- + +- Refer to `GPU Tutorial <./GPU-Tutorial.rst>`__ and `GPU Targets <./GPU-Targets.rst>`__. + +Recommendations for gcc Users (MinGW, \*nix) +-------------------------------------------- + +- Refer to `gcc Tips <./gcc-Tips.rst>`__. diff --git a/docs/development.rst b/docs/Development-Guide.rst similarity index 96% rename from docs/development.rst rename to docs/Development-Guide.rst index 880d03793..f9e5ac1c5 100644 --- a/docs/development.rst +++ b/docs/Development-Guide.rst @@ -4,7 +4,7 @@ Development Guide Algorithms ---------- -Refer to `Features <./Features.md>`__ to understand important algorithms used in LightGBM. +Refer to `Features <./Features.rst>`__ to understand important algorithms used in LightGBM. Classes and Code Structure -------------------------- @@ -68,9 +68,7 @@ Code Structure Documents API ~~~~~~~~~~~~~ -LightGBM support use `doxygen `__ to generate documents for classes and functions. - -Refer to `docs README <./README.md>`__. +Refer to `docs README <./README.rst>`__. C API ----- @@ -85,6 +83,6 @@ See the implementations at `Python-package `__. +Refer to `FAQ <./FAQ.rst>`__. Also feel free to open `issues `__ if you met problems. diff --git a/docs/FAQ.md b/docs/FAQ.md deleted file mode 100644 index c3ac9126e..000000000 --- a/docs/FAQ.md +++ /dev/null @@ -1,138 +0,0 @@ -LightGBM FAQ -============ - -### Contents - -- [Critical](#critical) -- [LightGBM](#lightgbm) -- [R-package](#r-package) -- [Python-package](#python-package) - ---- - -### Critical - -You encountered a critical issue when using LightGBM (crash, prediction error, non sense outputs...). Who should you contact? - -If your issue is not critical, just post an issue in [Microsoft/LightGBM repository](https://github.com/Microsoft/LightGBM/issues). - -If it is a critical issue, identify first what error you have: - -* Do you think it is reproducible on CLI (command line interface), R, and/or Python? -* Is it specific to a wrapper? (R or Python?) -* Is it specific to the compiler? (gcc versions? MinGW versions?) -* Is it specific to your Operating System? (Windows? Linux?) -* Are you able to reproduce this issue with a simple case? -* Are you able to (not) reproduce this issue after removing all optimization flags and compiling LightGBM in debug mode? - -Depending on the answers, while opening your issue, feel free to ping (just mention them with the arobase (@) symbol) appropriately so we can attempt to solve your problem faster: - -* [@guolinke](https://github.com/guolinke) (C++ code / R-package / Python-package) -* [@Laurae2](https://github.com/Laurae2) (R-package) -* [@wxchan](https://github.com/wxchan) (Python-package) -* [@henry0312](https://github.com/henry0312) (Python-package) -* [@StrikerRUS](https://github.com/StrikerRUS) (Python-package) -* [@huanzhang12](https://github.com/huanzhang12) (GPU support) - -Remember this is a free/open community support. We may not be available 24/7 to provide support. - ---- - -### LightGBM - -- **Question 1**: Where do I find more details about LightGBM parameters? - -- **Solution 1**: Look at [Parameters](./Parameters.md) and [Laurae++/Parameters](https://sites.google.com/view/lauraepp/parameters) website. - ---- - -- **Question 2**: On datasets with million of features, training do not start (or starts after a very long time). - -- **Solution 2**: Use a smaller value for `bin_construct_sample_cnt` and a larger value for `min_data`. - ---- - -- **Question 3**: When running LightGBM on a large dataset, my computer runs out of RAM. - -- **Solution 3**: Multiple solutions: set `histogram_pool_size` parameter to the MB you want to use for LightGBM (histogram_pool_size + dataset size = approximately RAM used), lower `num_leaves` or lower `max_bin` (see [Microsoft/LightGBM#562](https://github.com/Microsoft/LightGBM/issues/562)). - ---- - -- **Question 4**: I am using Windows. Should I use Visual Studio or MinGW for compiling LightGBM? - -- **Solution 4**: It is recommended to [use Visual Studio](https://github.com/Microsoft/LightGBM/issues/542) as its performance is higher for LightGBM. - ---- - -- **Question 5**: When using LightGBM GPU, I cannot reproduce results over several runs. - -- **Solution 5**: It is a normal issue, there is nothing we/you can do about, you may try to use `gpu_use_dp = true` for reproducibility (see [Microsoft/LightGBM#560](https://github.com/Microsoft/LightGBM/pull/560#issuecomment-304561654)). You may also use CPU version. - ---- - -- **Question 6**: Bagging is not reproducible when changing the number of threads. - -- **Solution 6**: As LightGBM bagging is running multithreaded, its output is dependent on the number of threads used. There is [no workaround currently](https://github.com/Microsoft/LightGBM/issues/632). - ---- - -- **Question 7**: I tried to use Random Forest mode, and LightGBM crashes! - -- **Solution 7**: It is by design. You must use `bagging_fraction` and `feature_fraction` different from 1, along with a `bagging_freq`. See [this thread](https://github.com/Microsoft/LightGBM/issues/691) as an example. - ---- - -- **Question 8**: CPU are not kept busy (like 10% CPU usage only) in Windows when using LightGBM on very large datasets with many core systems. - -- **Solution 8**: Please use [Visual Studio](https://www.visualstudio.com/downloads/) as it may be [10x faster than MinGW](https://github.com/Microsoft/LightGBM/issues/749) especially for very large trees. - ---- - -### R-package - -- **Question 1**: Any training command using LightGBM does not work after an error occurred during the training of a previous LightGBM model. - -- **Solution 1**: Run `lgb.unloader(wipe = TRUE)` in the R console, and recreate the LightGBM datasets (this will wipe all LightGBM-related variables). Due to the pointers, choosing to not wipe variables will not fix the error. This is a known issue: [Microsoft/LightGBM#698](https://github.com/Microsoft/LightGBM/issues/698). - -- **Question 2**: I used `setinfo`, tried to print my `lgb.Dataset`, and now the R console froze! - -- **Solution 2**: Avoid printing the `lgb.Dataset` after using `setinfo`. This is a known bug: [Microsoft/LightGBM#539](https://github.com/Microsoft/LightGBM/issues/539). - ---- - -### Python-package - -- **Question 1**: I see error messages like this when install from github using `python setup.py install`. - - ``` - error: Error: setup script specifies an absolute path: - - /Users/Microsoft/LightGBM/python-package/lightgbm/../../lib_lightgbm.so - - setup() arguments must *always* be /-separated paths relative to the - setup.py directory, *never* absolute paths. - ``` - -- **Solution 1**: this error should be solved in latest version. If you still meet this error, try to remove lightgbm.egg-info folder in your Python-package and reinstall, or check [this thread on stackoverflow](http://stackoverflow.com/questions/18085571/pip-install-error-setup-script-specifies-an-absolute-path). - ---- - -- **Question 2**: I see error messages like - ``` - Cannot get/set label/weight/init_score/group/num_data/num_feature before construct dataset - ``` - but I already construct dataset by some code like - ``` - train = lightgbm.Dataset(X_train, y_train) - ``` - or error messages like - ``` - Cannot set predictor/reference/categorical feature after freed raw data, set free_raw_data=False when construct Dataset to avoid this. - ``` - -- **Solution 2**: Because LightGBM constructs bin mappers to build trees, and train and valid Datasets within one Booster share the same bin mappers, categorical features and feature names etc., the Dataset objects are constructed when construct a Booster. And if you set `free_raw_data=True` (default), the raw data (with Python data struct) will be freed. So, if you want to: - - + get label(or weight/init_score/group) before construct dataset, it's same as get `self.label` - + set label(or weight/init_score/group) before construct dataset, it's same as `self.label=some_label_array` - + get num_data(or num_feature) before construct dataset, you can get data with `self.data`, then if your data is `numpy.ndarray`, use some code like `self.data.shape` - + set predictor(or reference/categorical feature) after construct dataset, you should set `free_raw_data=False` or init a Dataset object with the same raw data diff --git a/docs/FAQ.rst b/docs/FAQ.rst new file mode 100644 index 000000000..1d45b1ecf --- /dev/null +++ b/docs/FAQ.rst @@ -0,0 +1,175 @@ +LightGBM FAQ +============ + +Contents +~~~~~~~~ + +- `Critical <#critical>`__ + +- `LightGBM <#lightgbm>`__ + +- `R-package <#r-package>`__ + +- `Python-package <#python-package>`__ + +-------------- + +Critical +~~~~~~~~ + +You encountered a critical issue when using LightGBM (crash, prediction error, non sense outputs...). Who should you contact? + +If your issue is not critical, just post an issue in `Microsoft/LightGBM repository `__. + +If it is a critical issue, identify first what error you have: + +- Do you think it is reproducible on CLI (command line interface), R, and/or Python? + +- Is it specific to a wrapper? (R or Python?) + +- Is it specific to the compiler? (gcc versions? MinGW versions?) + +- Is it specific to your Operating System? (Windows? Linux?) + +- Are you able to reproduce this issue with a simple case? + +- Are you able to (not) reproduce this issue after removing all optimization flags and compiling LightGBM in debug mode? + +Depending on the answers, while opening your issue, feel free to ping (just mention them with the arobase (@) symbol) appropriately so we can attempt to solve your problem faster: + +- `@guolinke `__ (C++ code / R-package / Python-package) +- `@Laurae2 `__ (R-package) +- `@wxchan `__ (Python-package) +- `@henry0312 `__ (Python-package) +- `@StrikerRUS `__ (Python-package) +- `@huanzhang12 `__ (GPU support) + +Remember this is a free/open community support. We may not be available 24/7 to provide support. + +-------------- + +LightGBM +~~~~~~~~ + +- **Question 1**: Where do I find more details about LightGBM parameters? + +- **Solution 1**: Take a look at `Parameters <./Parameters.rst>`__ and `Laurae++/Parameters `__ website. + +-------------- + +- **Question 2**: On datasets with million of features, training do not start (or starts after a very long time). + +- **Solution 2**: Use a smaller value for ``bin_construct_sample_cnt`` and a larger value for ``min_data``. + +-------------- + +- **Question 3**: When running LightGBM on a large dataset, my computer runs out of RAM. + +- **Solution 3**: Multiple solutions: set ``histogram_pool_size`` parameter to the MB you want to use for LightGBM (histogram\_pool\_size + dataset size = approximately RAM used), + lower ``num_leaves`` or lower ``max_bin`` (see `Microsoft/LightGBM#562 `__). + +-------------- + +- **Question 4**: I am using Windows. Should I use Visual Studio or MinGW for compiling LightGBM? + +- **Solution 4**: It is recommended to `use Visual Studio `__ as its performance is higher for LightGBM. + +-------------- + +- **Question 5**: When using LightGBM GPU, I cannot reproduce results over several runs. + +- **Solution 5**: It is a normal issue, there is nothing we/you can do about, + you may try to use ``gpu_use_dp = true`` for reproducibility (see `Microsoft/LightGBM#560 `__). + You may also use CPU version. + +-------------- + +- **Question 6**: Bagging is not reproducible when changing the number of threads. + +- **Solution 6**: As LightGBM bagging is running multithreaded, its output is dependent on the number of threads used. + There is `no workaround currently `__. + +-------------- + +- **Question 7**: I tried to use Random Forest mode, and LightGBM crashes! + +- **Solution 7**: It is by design. + You must use ``bagging_fraction`` and ``feature_fraction`` different from 1, along with a ``bagging_freq``. + See `this thread `__ as an example. + +-------------- + +- **Question 8**: CPU are not kept busy (like 10% CPU usage only) in Windows when using LightGBM on very large datasets with many core systems. + +- **Solution 8**: Please use `Visual Studio `__ + as it may be `10x faster than MinGW `__ especially for very large trees. + +-------------- + +R-package +~~~~~~~~~ + +- **Question 1**: Any training command using LightGBM does not work after an error occurred during the training of a previous LightGBM model. + +- **Solution 1**: Run ``lgb.unloader(wipe = TRUE)`` in the R console, and recreate the LightGBM datasets (this will wipe all LightGBM-related variables). + Due to the pointers, choosing to not wipe variables will not fix the error. + This is a known issue: `Microsoft/LightGBM#698 `__. + +-------------- + +- **Question 2**: I used ``setinfo``, tried to print my ``lgb.Dataset``, and now the R console froze! + +- **Solution 2**: Avoid printing the ``lgb.Dataset`` after using ``setinfo``. + This is a known bug: `Microsoft/LightGBM#539 `__. + +-------------- + +Python-package +~~~~~~~~~~~~~~ + +- **Question 1**: I see error messages like this when install from GitHub using ``python setup.py install``. + + :: + + error: Error: setup script specifies an absolute path: + /Users/Microsoft/LightGBM/python-package/lightgbm/../../lib_lightgbm.so + setup() arguments must *always* be /-separated paths relative to the setup.py directory, *never* absolute paths. + +- **Solution 1**: This error should be solved in latest version. + If you still meet this error, try to remove ``lightgbm.egg-info`` folder in your Python-package and reinstall, + or check `this thread on stackoverflow `__. + +-------------- + +- **Question 2**: I see error messages like + + :: + + Cannot get/set label/weight/init_score/group/num_data/num_feature before construct dataset + + but I've already constructed dataset by some code like + + :: + + train = lightgbm.Dataset(X_train, y_train) + + or error messages like + + :: + + Cannot set predictor/reference/categorical feature after freed raw data, set free_raw_data=False when construct Dataset to avoid this. + +- **Solution 2**: Because LightGBM constructs bin mappers to build trees, and train and valid Datasets within one Booster share the same bin mappers, + categorical features and feature names etc., the Dataset objects are constructed when construct a Booster. + And if you set ``free_raw_data=True`` (default), the raw data (with Python data struct) will be freed. + So, if you want to: + + - get label(or weight/init\_score/group) before construct dataset, it's same as get ``self.label`` + + - set label(or weight/init\_score/group) before construct dataset, it's same as ``self.label=some_label_array`` + + - get num\_data(or num\_feature) before construct dataset, you can get data with ``self.data``, + then if your data is ``numpy.ndarray``, use some code like ``self.data.shape`` + + - set predictor(or reference/categorical feature) after construct dataset, + you should set ``free_raw_data=False`` or init a Dataset object with the same raw data diff --git a/docs/Features.md b/docs/Features.md deleted file mode 100644 index c5876bf0a..000000000 --- a/docs/Features.md +++ /dev/null @@ -1,183 +0,0 @@ -# Features - -This is a short introduction for the features and algorithms used in LightGBM. - -This page doesn't contain detailed algorithms, please refer to cited papers or source code if you are interested. - -## Optimization in Speed and Memory Usage - -Many boosting tools use pre-sorted based algorithms[[1, 2]](#references) (e.g. default algorithm in xgboost) for decision tree learning. It is a simple solution, but not easy to optimize. - -LightGBM uses the histogram based algorithms[[3, 4, 5]](#references), which bucketing continuous feature(attribute) values into discrete bins, to speed up training procedure and reduce memory usage. Following are advantages for histogram based algorithms: - -- **Reduce calculation cost of split gain** - - Pre-sorted based algorithms need ``O(#data)`` times calculation - - Histogram based algorithms only need to calculate ``O(#bins)`` times, and ``#bins`` is far smaller than ``#data`` - - It still needs ``O(#data)`` times to construct histogram, which only contain sum-up operation -- **Use histogram subtraction for further speed-up** - - To get one leaf's histograms in a binary tree, can use the histogram subtraction of its parent and its neighbor - - So it only need to construct histograms for one leaf (with smaller ``#data`` than its neighbor), then can get histograms of its neighbor by histogram subtraction with small cost(``O(#bins)``) -- **Reduce memory usage** - - Can replace continuous values to discrete bins. If ``#bins`` is small, can use small data type, e.g. uint8_t, to store training data - - No need to store additional information for pre-sorting feature values -- **Reduce communication cost for parallel learning** - -## Sparse Optimization - -- Only need ``O(2 * #non_zero_data)`` to construct histogram for sparse features - -## Optimization in Accuracy - -### Leaf-wise (Best-first) Tree Growth - -Most decision tree learning algorithms grow tree by level(depth)-wise, like the following image: - -![level_wise](./_static/images/level-wise.png) - -LightGBM grows tree by leaf-wise(best-first)[[6]](#references). It will choose the leaf with max delta loss to grow. When growing same ``#leaf``, leaf-wise algorithm can reduce more loss than level-wise algorithm. - -Leaf-wise may cause over-fitting when ``#data`` is small. So, LightGBM can use an additional parameter ``max_depth`` to limit depth of tree and avoid over-fitting (tree still grows by leaf-wise). - -![leaf_wise](./_static/images/leaf-wise.png) - -### Optimal Split for Categorical Features - -We often convert the categorical features into one-hot coding. However, it is not a good solution in tree learner. The reason is, for the high cardinality categorical features, it will grow the very unbalance tree, and needs to grow very deep to achieve the good accuracy. - -Actually, the optimal solution is partitioning the categorical feature into 2 subsets, and there are ``2^(k-1) - 1`` possible partitions. But there is a efficient solution for regression tree[[7]](#references). It needs about ``k * log(k)`` to find the optimal partition. - -The basic idea is reordering the categories according to the relevance of training target. More specifically, reordering the histogram (of categorical feature) according to it's accumulate values (``sum_gradient / sum_hessian``), then find the best split on the sorted histogram. - -## Optimization in Network Communication - -It only needs to use some collective communication algorithms, like "All reduce", "All gather" and "Reduce scatter", in parallel learning of LightGBM. LightGBM implement state-of-art algorithms[[8]](#references). These collective communication algorithms can provide much better performance than point-to-point communication. - -## Optimization in Parallel Learning - -LightGBM provides following parallel learning algorithms. - -### Feature Parallel - -#### Traditional Algorithm - -Feature parallel aims to parallel the "Find Best Split" in the decision tree. The procedure of traditional feature parallel is: - -1. Partition data vertically (different machines have different feature set) -2. Workers find local best split point {feature, threshold} on local feature set -3. Communicate local best splits with each other and get the best one -4. Worker with best split to perform split, then send the split result of data to other workers -5. Other workers split data according received data - -The shortage of traditional feature parallel: - -- Has computation overhead, since it cannot speed up "split", whose time complexity is ``O(#data)``. Thus, feature parallel cannot speed up well when ``#data`` is large. -- Need communication of split result, which cost about ``O(#data / 8)`` (one bit for one data). - -#### Feature Parallel in LightGBM - -Since feature parallel cannot speed up well when ``#data`` is large, we make a little change here: instead of partitioning data vertically, every worker holds the full data. Thus, LightGBM doesn't need to communicate for split result of data since every worker know how to split data. And ``#data`` won't be larger, so it is reasonable to hold full data in every machine. - -The procedure of feature parallel in LightGBM: - -1. Workers find local best split point{feature, threshold} on local feature set -2. Communicate local best splits with each other and get the best one -3. Perform best split - -However, this feature parallel algorithm still suffers from computation overhead for "split" when ``#data`` is large. So it will be better to use data parallel when ``#data`` is large. - -### Data Parallel - -#### Traditional Algorithm - -Data parallel aims to parallel the whole decision learning. The procedure of data parallel is: - -1. Partition data horizontally -2. Workers use local data to construct local histograms -3. Merge global histograms from all local histograms -4. Find best split from merged global histograms, then perform splits - -The shortage of traditional data parallel: - -- High communication cost. If using point-to-point communication algorithm, communication cost for one machine is about ``O(#machine * #feature * #bin)``. If using collective communication algorithm (e.g. "All Reduce"), communication cost is about ``O(2 * #feature * #bin)`` (check cost of "All Reduce" in chapter 4.5 at [[8]](#references)). - -#### Data Parallel in LightGBM - -We reduce communication cost of data parallel in LightGBM: - -1. Instead of "Merge global histograms from all local histograms", LightGBM use "Reduce Scatter" to merge histograms of different(non-overlapping) features for different workers. Then workers find local best split on local merged histograms and sync up global best split. -2. As aforementioned, LightGBM use histogram subtraction to speed up training. Based on this, we can communicate histograms only for one leaf, and get its neighbor's histograms by subtraction as well. - -Above all, we reduce communication cost to ``O(0.5 * #feature * #bin)`` for data parallel in LightGBM. - -### Voting Parallel - -Voting parallel further reduce the communication cost in [Data Parallel](#data-parallel) to constant cost. It uses two stage voting to reduce the communication cost of feature histograms[[9]](#references). - -## GPU Support - -Thanks [@huanzhang12](https://github.com/huanzhang12) for contributing this feature. Please read[[10]](#references) to get more details. - -- [GPU Installation](./Installation-Guide.rst) -- [GPU Tutorial](./GPU-Tutorial.md) - -## Applications and Metrics - -Support following application: - -- regression, the objective function is L2 loss -- binary classification, the objective function is logloss -- multi classification -- lambdarank, the objective function is lambdarank with NDCG - -Support following metrics: - -- L1 loss -- L2 loss -- Log loss -- Classification error rate -- AUC -- NDCG -- Multi class log loss -- Multi class error rate - -For more details, please refer to [Parameters](./Parameters.md). - -## Other Features - -- Limit ``max_depth`` of tree while grows tree leaf-wise -- [DART](https://arxiv.org/abs/1505.01866) -- L1/L2 regularization -- Bagging -- Column(feature) sub-sample -- Continued train with input GBDT model -- Continued train with the input score file -- Weighted training -- Validation metric output during training -- Multi validation data -- Multi metrics -- Early stopping (both training and prediction) -- Prediction for leaf index - -For more details, please refer to [Parameters](./Parameters.md). - -## References - -[1] Mehta, Manish, Rakesh Agrawal, and Jorma Rissanen. "SLIQ: A fast scalable classifier for data mining." International Conference on Extending Database Technology. Springer Berlin Heidelberg, 1996. - -[2] Shafer, John, Rakesh Agrawal, and Manish Mehta. "SPRINT: A scalable parallel classifier for data mining." Proc. 1996 Int. Conf. Very Large Data Bases. 1996. - -[3] Ranka, Sanjay, and V. Singh. "CLOUDS: A decision tree classifier for large datasets." Proceedings of the 4th Knowledge Discovery and Data Mining Conference. 1998. - -[4] Machado, F. P. "Communication and memory efficient parallel decision tree construction." (2003). - -[5] Li, Ping, Qiang Wu, and Christopher J. Burges. "Mcrank: Learning to rank using multiple classification and gradient boosting." Advances in neural information processing systems. 2007. - -[6] Shi, Haijian. "Best-first decision tree learning." Diss. The University of Waikato, 2007. - -[7] Walter D. Fisher. "[On Grouping for Maximum Homogeneity](http://amstat.tandfonline.com/doi/abs/10.1080/01621459.1958.10501479)." Journal of the American Statistical Association. Vol. 53, No. 284 (Dec., 1958), pp. 789-798. - -[8] Thakur, Rajeev, Rolf Rabenseifner, and William Gropp. "[Optimization of collective communication operations in MPICH](http://wwwi10.lrr.in.tum.de/~gerndt/home/Teaching/HPCSeminar/mpich_multi_coll.pdf)." International Journal of High Performance Computing Applications 19.1 (2005): 49-66. - -[9] Qi Meng, Guolin Ke, Taifeng Wang, Wei Chen, Qiwei Ye, Zhi-Ming Ma, Tieyan Liu. "[A Communication-Efficient Parallel Algorithm for Decision Tree](http://papers.nips.cc/paper/6381-a-communication-efficient-parallel-algorithm-for-decision-tree)." Advances in Neural Information Processing Systems 29 (NIPS 2016). - -[10] Huan Zhang, Si Si and Cho-Jui Hsieh. "[GPU Acceleration for Large-scale Tree Boosting](https://arxiv.org/abs/1706.08359)." arXiv:1706.08359, 2017. diff --git a/docs/Features.rst b/docs/Features.rst new file mode 100644 index 000000000..525b4abce --- /dev/null +++ b/docs/Features.rst @@ -0,0 +1,273 @@ +Features +======== + +This is a short introduction for the features and algorithms used in LightGBM. + +This page doesn't contain detailed algorithms, please refer to cited papers or source code if you are interested. + +Optimization in Speed and Memory Usage +-------------------------------------- + +Many boosting tools use pre-sorted based algorithms\ `[1, 2] <#references>`__ (e.g. default algorithm in xgboost) for decision tree learning. It is a simple solution, but not easy to optimize. + +LightGBM uses the histogram based algorithms\ `[3, 4, 5] <#references>`__, which bucketing continuous feature(attribute) values into discrete bins, to speed up training procedure and reduce memory usage. +Following are advantages for histogram based algorithms: + +- **Reduce calculation cost of split gain** + + - Pre-sorted based algorithms need ``O(#data)`` times calculation + + - Histogram based algorithms only need to calculate ``O(#bins)`` times, and ``#bins`` is far smaller than ``#data`` + + - It still needs ``O(#data)`` times to construct histogram, which only contain sum-up operation + +- **Use histogram subtraction for further speed-up** + + - To get one leaf's histograms in a binary tree, can use the histogram subtraction of its parent and its neighbor + + - So it only need to construct histograms for one leaf (with smaller ``#data`` than its neighbor), then can get histograms of its neighbor by histogram subtraction with small cost(``O(#bins)``) +- **Reduce memory usage** + + - Can replace continuous values to discrete bins. If ``#bins`` is small, can use small data type, e.g. uint8\_t, to store training data + + - No need to store additional information for pre-sorting feature values + +- **Reduce communication cost for parallel learning** + +Sparse Optimization +------------------- + +- Only need ``O(2 * #non_zero_data)`` to construct histogram for sparse features + +Optimization in Accuracy +------------------------ + +Leaf-wise (Best-first) Tree Growth +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Most decision tree learning algorithms grow tree by level(depth)-wise, like the following image: + +.. image:: ./_static/images/level-wise.png + :align: center + +LightGBM grows tree by leaf-wise (best-first)\ `[6] <#references>`__. It will choose the leaf with max delta loss to grow. +When growing same ``#leaf``, leaf-wise algorithm can reduce more loss than level-wise algorithm. + +Leaf-wise may cause over-fitting when ``#data`` is small. +So, LightGBM can use an additional parameter ``max_depth`` to limit depth of tree and avoid over-fitting (tree still grows by leaf-wise). + +.. image:: ./_static/images/leaf-wise.png + :align: center + +Optimal Split for Categorical Features +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +We often convert the categorical features into one-hot coding. +However, it is not a good solution in tree learner. +The reason is, for the high cardinality categorical features, it will grow the very unbalance tree, and needs to grow very deep to achieve the good accuracy. + +Actually, the optimal solution is partitioning the categorical feature into 2 subsets, and there are ``2^(k-1) - 1`` possible partitions. +But there is a efficient solution for regression tree\ `[7] <#references>`__. It needs about ``k * log(k)`` to find the optimal partition. + +The basic idea is reordering the categories according to the relevance of training target. +More specifically, reordering the histogram (of categorical feature) according to it's accumulate values (``sum_gradient / sum_hessian``), then find the best split on the sorted histogram. + +Optimization in Network Communication +------------------------------------- + +It only needs to use some collective communication algorithms, like "All reduce", "All gather" and "Reduce scatter", in parallel learning of LightGBM. +LightGBM implement state-of-art algorithms\ `[8] <#references>`__. +These collective communication algorithms can provide much better performance than point-to-point communication. + +Optimization in Parallel Learning +--------------------------------- + +LightGBM provides following parallel learning algorithms. + +Feature Parallel +~~~~~~~~~~~~~~~~ + +Traditional Algorithm +^^^^^^^^^^^^^^^^^^^^^ + +Feature parallel aims to parallel the "Find Best Split" in the decision tree. The procedure of traditional feature parallel is: + +1. Partition data vertically (different machines have different feature set) + +2. Workers find local best split point {feature, threshold} on local feature set + +3. Communicate local best splits with each other and get the best one + +4. Worker with best split to perform split, then send the split result of data to other workers + +5. Other workers split data according received data + +The shortage of traditional feature parallel: + +- Has computation overhead, since it cannot speed up "split", whose time complexity is ``O(#data)``. + Thus, feature parallel cannot speed up well when ``#data`` is large. + +- Need communication of split result, which cost about ``O(#data / 8)`` (one bit for one data). + +Feature Parallel in LightGBM +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Since feature parallel cannot speed up well when ``#data`` is large, we make a little change here: instead of partitioning data vertically, every worker holds the full data. +Thus, LightGBM doesn't need to communicate for split result of data since every worker know how to split data. +And ``#data`` won't be larger, so it is reasonable to hold full data in every machine. + +The procedure of feature parallel in LightGBM: + +1. Workers find local best split point {feature, threshold} on local feature set + +2. Communicate local best splits with each other and get the best one + +3. Perform best split + +However, this feature parallel algorithm still suffers from computation overhead for "split" when ``#data`` is large. +So it will be better to use data parallel when ``#data`` is large. + +Data Parallel +~~~~~~~~~~~~~ + +Traditional Algorithm +^^^^^^^^^^^^^^^^^^^^^ + +Data parallel aims to parallel the whole decision learning. The procedure of data parallel is: + +1. Partition data horizontally + +2. Workers use local data to construct local histograms + +3. Merge global histograms from all local histograms + +4. Find best split from merged global histograms, then perform splits + +The shortage of traditional data parallel: + +- High communication cost. + If using point-to-point communication algorithm, communication cost for one machine is about ``O(#machine * #feature * #bin)``. + If using collective communication algorithm (e.g. "All Reduce"), communication cost is about ``O(2 * #feature * #bin)`` (check cost of "All Reduce" in chapter 4.5 at `[8] <#references>`__). + +Data Parallel in LightGBM +^^^^^^^^^^^^^^^^^^^^^^^^^ + +We reduce communication cost of data parallel in LightGBM: + +1. Instead of "Merge global histograms from all local histograms", LightGBM use "Reduce Scatter" to merge histograms of different(non-overlapping) features for different workers. + Then workers find local best split on local merged histograms and sync up global best split. + +2. As aforementioned, LightGBM use histogram subtraction to speed up training. + Based on this, we can communicate histograms only for one leaf, and get its neighbor's histograms by subtraction as well. + +Above all, we reduce communication cost to ``O(0.5 * #feature * #bin)`` for data parallel in LightGBM. + +Voting Parallel +~~~~~~~~~~~~~~~ + +Voting parallel further reduce the communication cost in `Data Parallel <#data-parallel>`__ to constant cost. +It uses two stage voting to reduce the communication cost of feature histograms\ `[9] <#references>`__. + +GPU Support +----------- + +Thanks `@huanzhang12 `__ for contributing this feature. Please read `[10] <#references>`__ to get more details. + +- `GPU Installation <./Installation-Guide.rst#build-gpu-version>`__ + +- `GPU Tutorial <./GPU-Tutorial.rst>`__ + +Applications and Metrics +------------------------ + +Support following application: + +- regression, the objective function is L2 loss + +- binary classification, the objective function is logloss + +- multi classification + +- lambdarank, the objective function is lambdarank with NDCG + +Support following metrics: + +- L1 loss + +- L2 loss + +- Log loss + +- Classification error rate + +- AUC + +- NDCG + +- Multi class log loss + +- Multi class error rate + +For more details, please refer to `Parameters <./Parameters.rst#metric-parameters>`__. + +Other Features +-------------- + +- Limit ``max_depth`` of tree while grows tree leaf-wise + +- `DART `__ + +- L1/L2 regularization + +- Bagging + +- Column(feature) sub-sample + +- Continued train with input GBDT model + +- Continued train with the input score file + +- Weighted training + +- Validation metric output during training + +- Multi validation data + +- Multi metrics + +- Early stopping (both training and prediction) + +- Prediction for leaf index + +For more details, please refer to `Parameters <./Parameters.rst>`__. + +References +---------- + +[1] Mehta, Manish, Rakesh Agrawal, and Jorma Rissanen. "SLIQ: A fast scalable classifier for data mining." International Conference on Extending Database Technology. Springer Berlin Heidelberg, 1996. + +[2] Shafer, John, Rakesh Agrawal, and Manish Mehta. "SPRINT: A scalable parallel classifier for data mining." Proc. 1996 Int. Conf. Very Large Data Bases. 1996. + +[3] Ranka, Sanjay, and V. Singh. "CLOUDS: A decision tree classifier for large datasets." Proceedings of the 4th Knowledge Discovery and Data Mining Conference. 1998. + +[4] Machado, F. P. "Communication and memory efficient parallel decision tree construction." (2003). + +[5] Li, Ping, Qiang Wu, and Christopher J. Burges. "Mcrank: Learning to rank using multiple classification and gradient boosting." Advances in neural information processing systems. 2007. + +[6] Shi, Haijian. "Best-first decision tree learning." Diss. The University of Waikato, 2007. + +[7] Walter D. Fisher. "`On Grouping for Maximum Homogeneity`_." Journal of the American Statistical Association. Vol. 53, No. 284 (Dec., 1958), pp. 789-798. + +[8] Thakur, Rajeev, Rolf Rabenseifner, and William Gropp. "`Optimization of collective communication operations in MPICH`_." International Journal of High Performance Computing Applications 19.1 (2005): 49-66. + +[9] Qi Meng, Guolin Ke, Taifeng Wang, Wei Chen, Qiwei Ye, Zhi-Ming Ma, Tieyan Liu. "`A Communication-Efficient Parallel Algorithm for Decision Tree`_." Advances in Neural Information Processing Systems 29 (NIPS 2016). + +[10] Huan Zhang, Si Si and Cho-Jui Hsieh. "`GPU Acceleration for Large-scale Tree Boosting`_." arXiv:1706.08359, 2017. + +.. _On Grouping for Maximum Homogeneity: http://amstat.tandfonline.com/doi/abs/10.1080/01621459.1958.10501479 + +.. _Optimization of collective communication operations in MPICH: http://wwwi10.lrr.in.tum.de/~gerndt/home/Teaching/HPCSeminar/mpich_multi_coll.pdf + +.. _A Communication-Efficient Parallel Algorithm for Decision Tree: http://papers.nips.cc/paper/6381-a-communication-efficient-parallel-algorithm-for-decision-tree + +.. _GPU Acceleration for Large-scale Tree Boosting: https://arxiv.org/abs/1706.08359 diff --git a/docs/GPU-Performance.rst b/docs/GPU-Performance.rst index 0fc252cc4..8df1ea366 100644 --- a/docs/GPU-Performance.rst +++ b/docs/GPU-Performance.rst @@ -161,7 +161,8 @@ For most datasets, using 63 bins is sufficient. We record the wall clock time after 500 iterations, as shown in the figure below: -|Performance Comparison| +.. image:: ./_static/images/gpu-performance-comparison.png + :align: center When using a GPU, it is advisable to use a bin size of 63 rather than 255, because it can speed up training significantly without noticeably affecting accuracy. On CPU, using a smaller bin size only marginally improves performance, sometimes even slows down training, @@ -206,6 +207,4 @@ Huan Zhang, Si Si and Cho-Jui Hsieh. `GPU Acceleration for Large-scale Tree Boos .. _0bb4a82: https://github.com/Microsoft/LightGBM/commit/0bb4a82 -.. |Performance Comparison| image:: ./_static/images/gpu-performance-comparison.png - .. _GPU Acceleration for Large-scale Tree Boosting: https://arxiv.org/abs/1706.08359 diff --git a/docs/GPU-Targets.rst b/docs/GPU-Targets.rst index 4540dcd06..4448fe6b1 100644 --- a/docs/GPU-Targets.rst +++ b/docs/GPU-Targets.rst @@ -1,9 +1,8 @@ GPU Targets Table ================= -When using OpenCL SDKs, targeting CPU and GPU at the same time is -sometimes possible. This is especially true for Intel OpenCL SDK and AMD -APP SDK. +When using OpenCL SDKs, targeting CPU and GPU at the same time is sometimes possible. +This is especially true for Intel OpenCL SDK and AMD APP SDK. You can find below a table of correspondence: @@ -22,8 +21,7 @@ Legend: - \* Not usable directly. - \*\* Reported as unsupported in public forums. -AMD GPUs using Intel SDK for OpenCL is not a typo, nor AMD APP SDK -compatibility with CPUs. +AMD GPUs using Intel SDK for OpenCL is not a typo, nor AMD APP SDK compatibility with CPUs. -------------- @@ -36,8 +34,7 @@ We present the following scenarii: - Single CPU and GPU (even with integrated graphics) - Multiple CPU/GPU -We provide test R code below, but you can use the language of your -choice with the examples of your choices: +We provide test R code below, but you can use the language of your choice with the examples of your choices: .. code:: r @@ -73,15 +70,13 @@ Using a bad ``gpu_device_id`` is not critical, as it will fallback to: - ``gpu_device_id = 0`` if using ``gpu_platform_id = 0`` - ``gpu_device_id = 1`` if using ``gpu_platform_id = 1`` -However, using a bad combination of ``gpu_platform_id`` and -``gpu_device_id`` will lead to a **crash** (you will lose your entire -session content). Beware of it. +However, using a bad combination of ``gpu_platform_id`` and ``gpu_device_id`` will lead to a **crash** (you will lose your entire session content). +Beware of it. CPU Only Architectures ---------------------- -When you have a single device (one CPU), OpenCL usage is -straightforward: ``gpu_platform_id = 0``, ``gpu_device_id = 0`` +When you have a single device (one CPU), OpenCL usage is straightforward: ``gpu_platform_id = 0``, ``gpu_device_id = 0`` This will use the CPU with OpenCL, even though it says it says GPU. @@ -124,18 +119,15 @@ Example: Single CPU and GPU (even with integrated graphics) -------------------------------------------------- -If you have integrated graphics card (Intel HD Graphics) and a dedicated -graphics card (AMD, NVIDIA), the dedicated graphics card will -automatically override the integrated graphics card. The workaround is -to disable your dedicated graphics card to be able to use your -integrated graphics card. +If you have integrated graphics card (Intel HD Graphics) and a dedicated graphics card (AMD, NVIDIA), +the dedicated graphics card will automatically override the integrated graphics card. +The workaround is to disable your dedicated graphics card to be able to use your integrated graphics card. -When you have multiple devices (one CPU and one GPU), the order is -usually the following: +When you have multiple devices (one CPU and one GPU), the order is usually the following: + +- GPU: ``gpu_platform_id = 0``, ``gpu_device_id = 0``, + sometimes it is usable using ``gpu_platform_id = 1``, ``gpu_device_id = 1`` but at your own risk! -- GPU: ``gpu_platform_id = 0``, ``gpu_device_id = 0``, sometimes it is - usable using ``gpu_platform_id = 1``, ``gpu_device_id = 1`` but at - your own risk! - CPU: ``gpu_platform_id = 0``, ``gpu_device_id = 1`` Example of GPU (``gpu_platform_id = 0``, ``gpu_device_id = 0``): @@ -209,8 +201,7 @@ Example of CPU (``gpu_platform_id = 0``, ``gpu_device_id = 1``): [LightGBM] [Info] Trained a tree with leaves=7 and max_depth=5 [2]: test's rmse:0 -When using a wrong ``gpu_device_id``, it will automatically fallback to -``gpu_device_id = 0``: +When using a wrong ``gpu_device_id``, it will automatically fallback to ``gpu_device_id = 0``: .. code:: r @@ -245,8 +236,7 @@ When using a wrong ``gpu_device_id``, it will automatically fallback to [LightGBM] [Info] Trained a tree with leaves=7 and max_depth=5 [2]: test's rmse:0 -Do not ever run under the following scenario as it is known to crash -even if it says it is using the CPU because it is NOT the case: +Do not ever run under the following scenario as it is known to crash even if it says it is using the CPU because it is NOT the case: - One CPU and one GPU - ``gpu_platform_id = 1``, ``gpu_device_id = 0`` @@ -284,13 +274,12 @@ even if it says it is using the CPU because it is NOT the case: Multiple CPU and GPU -------------------- -If you have multiple devices (multiple CPUs and multiple GPUs), you will -have to test different ``gpu_device_id`` and different -``gpu_platform_id`` values to find out the values which suits the -CPU/GPU you want to use. Keep in mind that using the integrated graphics -card is not directly possible without disabling every dedicated graphics -card. +If you have multiple devices (multiple CPUs and multiple GPUs), +you will have to test different ``gpu_device_id`` and different ``gpu_platform_id`` values to find out the values which suits the CPU/GPU you want to use. +Keep in mind that using the integrated graphics card is not directly possible without disabling every dedicated graphics card. .. _Intel SDK for OpenCL: https://software.intel.com/en-us/articles/opencl-drivers + .. _AMD APP SDK: http://developer.amd.com/amd-accelerated-parallel-processing-app-sdk/ + .. _NVIDIA CUDA Toolkit: https://developer.nvidia.com/cuda-downloads diff --git a/docs/GPU-Tutorial.md b/docs/GPU-Tutorial.md deleted file mode 100644 index 72652c73e..000000000 --- a/docs/GPU-Tutorial.md +++ /dev/null @@ -1,179 +0,0 @@ -LightGBM GPU Tutorial -===================== - -The purpose of this document is to give you a quick step-by-step tutorial on GPU training. - -For Windows, please see [GPU Windows Tutorial](./GPU-Windows.md). - -We will use the GPU instance on [Microsoft Azure cloud computing platform](https://azure.microsoft.com/) for demonstration, but you can use any machine with modern AMD or NVIDIA GPUs. - -GPU Setup ---------- - -You need to launch a `NV` type instance on Azure (available in East US, North Central US, South Central US, West Europe and Southeast Asia zones) and select Ubuntu 16.04 LTS as the operating system. - -For testing, the smallest `NV6` type virtual machine is sufficient, which includes 1/2 M60 GPU, with 8 GB memory, 180 GB/s memory bandwidth and 4,825 GFLOPS peak computation power. Don't use the `NC` type instance as the GPUs (K80) are based on an older architecture (Kepler). - -First we need to install minimal NVIDIA drivers and OpenCL development environment: - -``` -sudo apt-get update -sudo apt-get install --no-install-recommends nvidia-375 -sudo apt-get install --no-install-recommends nvidia-opencl-icd-375 nvidia-opencl-dev opencl-headers -``` - -After installing the drivers you need to restart the server. - -``` -sudo init 6 -``` - -After about 30 seconds, the server should be up again. - -If you are using a AMD GPU, you should download and install the [AMDGPU-Pro](http://support.amd.com/en-us/download/linux) driver and also install package `ocl-icd-libopencl1` and `ocl-icd-opencl-dev`. - -Build LightGBM --------------- - -Now install necessary building tools and dependencies: - -``` -sudo apt-get install --no-install-recommends git cmake build-essential libboost-dev libboost-system-dev libboost-filesystem-dev -``` - -The NV6 GPU instance has a 320 GB ultra-fast SSD mounted at /mnt. Let's use it as our workspace (skip this if you are using your own machine): - -``` -sudo mkdir -p /mnt/workspace -sudo chown $(whoami):$(whoami) /mnt/workspace -cd /mnt/workspace -``` - -Now we are ready to checkout LightGBM and compile it with GPU support: - -``` -git clone --recursive https://github.com/Microsoft/LightGBM -cd LightGBM -mkdir build ; cd build -cmake -DUSE_GPU=1 .. -make -j$(nproc) -cd .. -``` - -You will see two binaries are generated, `lightgbm` and `lib_lightgbm.so`. - -If you are building on OSX, you probably need to remove macro `BOOST_COMPUTE_USE_OFFLINE_CACHE` in `src/treelearner/gpu_tree_learner.h` to avoid a known crash bug in Boost.Compute. - -Install Python Interface (optional) ------------------------------------ - -If you want to use the Python interface of LightGBM, you can install it now (along with some necessary Python-package dependencies): - -``` -sudo apt-get -y install python-pip -sudo -H pip install setuptools numpy scipy scikit-learn -U -cd python-package/ -sudo python setup.py install -cd .. -``` - -You need to set an additional parameter `"device" : "gpu"` (along with your other options like `learning_rate`, `num_leaves`, etc) to use GPU in Python. - -You can read our [Python Guide](https://github.com/Microsoft/LightGBM/tree/master/examples/python-guide) for more information on how to use the Python interface. - -Dataset Preparation -------------------- - -Using the following commands to prepare the Higgs dataset: - -``` -git clone https://github.com/guolinke/boosting_tree_benchmarks.git -cd boosting_tree_benchmarks/data -wget "https://archive.ics.uci.edu/ml/machine-learning-databases/00280/HIGGS.csv.gz" -gunzip HIGGS.csv.gz -python higgs2libsvm.py -cd ../.. -ln -s boosting_tree_benchmarks/data/higgs.train -ln -s boosting_tree_benchmarks/data/higgs.test -``` - -Now we create a configuration file for LightGBM by running the following commands (please copy the entire block and run it as a whole): - -``` -cat > lightgbm_gpu.conf <> lightgbm_gpu.conf -``` - -GPU is enabled in the configuration file we just created by setting `device=gpu`. It will use the first GPU installed on the system by default (`gpu_platform_id=0` and `gpu_device_id=0`). - -Run Your First Learning Task on GPU ------------------------------------ - -Now we are ready to start GPU training! First we want to verify the GPU works correctly. Run the following command to train on GPU, and take a note of the AUC after 50 iterations: - -``` -./lightgbm config=lightgbm_gpu.conf data=higgs.train valid=higgs.test objective=binary metric=auc -``` - -Now train the same dataset on CPU using the following command. You should observe a similar AUC: - -``` -./lightgbm config=lightgbm_gpu.conf data=higgs.train valid=higgs.test objective=binary metric=auc device=cpu -``` - -Now we can make a speed test on GPU without calculating AUC after each iteration. - -``` -./lightgbm config=lightgbm_gpu.conf data=higgs.train objective=binary metric=auc -``` - -Speed test on CPU: - -``` -./lightgbm config=lightgbm_gpu.conf data=higgs.train objective=binary metric=auc device=cpu -``` - -You should observe over three times speedup on this GPU. - -The GPU acceleration can be used on other tasks/metrics (regression, multi-class classification, ranking, etc) as well. For example, we can train the Higgs dataset on GPU as a regression task: - -``` -./lightgbm config=lightgbm_gpu.conf data=higgs.train objective=regression_l2 metric=l2 -``` - -Also, you can compare the training speed with CPU: - -``` -./lightgbm config=lightgbm_gpu.conf data=higgs.train objective=regression_l2 metric=l2 device=cpu -``` - -Further Reading ---------------- - -[GPU Tuning Guide and Performance Comparison](./GPU-Performance.rst) - -[GPU SDK Correspondence and Device Targeting Table](./GPU-Targets.rst) - -[GPU Windows Tutorial](./GPU-Windows.md) - -Reference ---------- - -Please kindly cite the following article in your publications if you find the GPU acceleration useful: - -Huan Zhang, Si Si and Cho-Jui Hsieh. [GPU Acceleration for Large-scale Tree Boosting](https://arxiv.org/abs/1706.08359). arXiv:1706.08359, 2017. diff --git a/docs/GPU-Tutorial.rst b/docs/GPU-Tutorial.rst new file mode 100644 index 000000000..c30307c76 --- /dev/null +++ b/docs/GPU-Tutorial.rst @@ -0,0 +1,196 @@ +LightGBM GPU Tutorial +===================== + +The purpose of this document is to give you a quick step-by-step tutorial on GPU training. + +For Windows, please see `GPU Windows Tutorial <./GPU-Windows.rst>`__. + +We will use the GPU instance on `Microsoft Azure cloud computing platform`_ for demonstration, +but you can use any machine with modern AMD or NVIDIA GPUs. + +GPU Setup +--------- + +You need to launch a ``NV`` type instance on Azure (available in East US, North Central US, South Central US, West Europe and Southeast Asia zones) +and select Ubuntu 16.04 LTS as the operating system. + +For testing, the smallest ``NV6`` type virtual machine is sufficient, which includes 1/2 M60 GPU, with 8 GB memory, 180 GB/s memory bandwidth and 4,825 GFLOPS peak computation power. +Don't use the ``NC`` type instance as the GPUs (K80) are based on an older architecture (Kepler). + +First we need to install minimal NVIDIA drivers and OpenCL development environment: + +:: + + sudo apt-get update + sudo apt-get install --no-install-recommends nvidia-375 + sudo apt-get install --no-install-recommends nvidia-opencl-icd-375 nvidia-opencl-dev opencl-headers + +After installing the drivers you need to restart the server. + +:: + + sudo init 6 + +After about 30 seconds, the server should be up again. + +If you are using a AMD GPU, you should download and install the `AMDGPU-Pro`_ driver and also install package ``ocl-icd-libopencl1`` and ``ocl-icd-opencl-dev``. + +Build LightGBM +-------------- + +Now install necessary building tools and dependencies: + +:: + + sudo apt-get install --no-install-recommends git cmake build-essential libboost-dev libboost-system-dev libboost-filesystem-dev + +The ``NV6`` GPU instance has a 320 GB ultra-fast SSD mounted at ``/mnt``. +Let's use it as our workspace (skip this if you are using your own machine): + +:: + + sudo mkdir -p /mnt/workspace + sudo chown $(whoami):$(whoami) /mnt/workspace + cd /mnt/workspace + +Now we are ready to checkout LightGBM and compile it with GPU support: + +:: + + git clone --recursive https://github.com/Microsoft/LightGBM + cd LightGBM + mkdir build ; cd build + cmake -DUSE_GPU=1 .. + make -j$(nproc) + cd .. + +You will see two binaries are generated, ``lightgbm`` and ``lib_lightgbm.so``. + +If you are building on OSX, you probably need to remove macro ``BOOST_COMPUTE_USE_OFFLINE_CACHE`` in ``src/treelearner/gpu_tree_learner.h`` to avoid a known crash bug in Boost.Compute. + +Install Python Interface (optional) +----------------------------------- + +If you want to use the Python interface of LightGBM, you can install it now (along with some necessary Python-package dependencies): + +:: + + sudo apt-get -y install python-pip + sudo -H pip install setuptools numpy scipy scikit-learn -U + cd python-package/ + sudo python setup.py install --precompile + cd .. + +You need to set an additional parameter ``"device" : "gpu"`` (along with your other options like ``learning_rate``, ``num_leaves``, etc) to use GPU in Python. + +You can read our `Python Package Examples`_ for more information on how to use the Python interface. + +Dataset Preparation +------------------- + +Using the following commands to prepare the Higgs dataset: + +:: + + git clone https://github.com/guolinke/boosting_tree_benchmarks.git + cd boosting_tree_benchmarks/data + wget "https://archive.ics.uci.edu/ml/machine-learning-databases/00280/HIGGS.csv.gz" + gunzip HIGGS.csv.gz + python higgs2libsvm.py + cd ../.. + ln -s boosting_tree_benchmarks/data/higgs.train + ln -s boosting_tree_benchmarks/data/higgs.test + +Now we create a configuration file for LightGBM by running the following commands (please copy the entire block and run it as a whole): + +:: + + cat > lightgbm_gpu.conf <> lightgbm_gpu.conf + +GPU is enabled in the configuration file we just created by setting ``device=gpu``. +It will use the first GPU installed on the system by default (``gpu_platform_id=0`` and ``gpu_device_id=0``). + +Run Your First Learning Task on GPU +----------------------------------- + +Now we are ready to start GPU training! + +First we want to verify the GPU works correctly. +Run the following command to train on GPU, and take a note of the AUC after 50 iterations: + +:: + + ./lightgbm config=lightgbm_gpu.conf data=higgs.train valid=higgs.test objective=binary metric=auc + +Now train the same dataset on CPU using the following command. You should observe a similar AUC: + +:: + + ./lightgbm config=lightgbm_gpu.conf data=higgs.train valid=higgs.test objective=binary metric=auc device=cpu + +Now we can make a speed test on GPU without calculating AUC after each iteration. + +:: + + ./lightgbm config=lightgbm_gpu.conf data=higgs.train objective=binary metric=auc + +Speed test on CPU: + +:: + + ./lightgbm config=lightgbm_gpu.conf data=higgs.train objective=binary metric=auc device=cpu + +You should observe over three times speedup on this GPU. + +The GPU acceleration can be used on other tasks/metrics (regression, multi-class classification, ranking, etc) as well. +For example, we can train the Higgs dataset on GPU as a regression task: + +:: + + ./lightgbm config=lightgbm_gpu.conf data=higgs.train objective=regression_l2 metric=l2 + +Also, you can compare the training speed with CPU: + +:: + + ./lightgbm config=lightgbm_gpu.conf data=higgs.train objective=regression_l2 metric=l2 device=cpu + +Further Reading +--------------- + +- `GPU Tuning Guide and Performance Comparison <./GPU-Performance.rst>`__ + +- `GPU SDK Correspondence and Device Targeting Table <./GPU-Targets.rst>`__ + +- `GPU Windows Tutorial <./GPU-Windows.rst>`__ + +Reference +--------- + +Please kindly cite the following article in your publications if you find the GPU acceleration useful: + +Huan Zhang, Si Si and Cho-Jui Hsieh. "`GPU Acceleration for Large-scale Tree Boosting`_." arXiv:1706.08359, 2017. + +.. _Microsoft Azure cloud computing platform: https://azure.microsoft.com/ + +.. _AMDGPU-Pro: http://support.amd.com/en-us/download/linux + +.. _Python Package Examples: https://github.com/Microsoft/LightGBM/tree/master/examples/python-guide + +.. _GPU Acceleration for Large-scale Tree Boosting: https://arxiv.org/abs/1706.08359 diff --git a/docs/GPU-Windows.md b/docs/GPU-Windows.md deleted file mode 100644 index 29db5ad3d..000000000 --- a/docs/GPU-Windows.md +++ /dev/null @@ -1,450 +0,0 @@ -GPU Windows Compilation -======================= - -This guide is for the MinGW build. - -For the MSVC (Visual Studio) build with GPU, please refer to [Installation Guide](./Installation-Guide.rst). (We recommend you to use this since it is much easier). - -# Install LightGBM GPU version in Windows (CLI / R / Python), using MinGW/gcc - -This is for a vanilla installation of Boost, including full compilation steps from source without precompiled libraries. - -Installation steps (depends on what you are going to do): - -* Install the appropriate OpenCL SDK -* Install MinGW -* Install Boost -* Install Git -* Install CMake -* Create LightGBM binaries -* Debugging LightGBM in CLI (if GPU is crashing or any other crash reason) - -If you wish to use another compiler like Visual Studio C++ compiler, you need to adapt the steps to your needs. - -For this compilation tutorial, I am using AMD SDK for our OpenCL steps. However, you are free to use any OpenCL SDK you want, you just need to adjust the PATH correctly. - -You will also need administrator rights. This will not work without them. - -At the end, you can restore your original PATH. - ---- - -## Modifying PATH (for newbies) - -To modify PATH, just follow the pictures after going to the `Control Panel`: - -![System](./_static/images/screenshot-system.png) - -Then, go to `Advanced` > `Environment Variables...`: - -![Advanced System Settings](./_static/images/screenshot-advanced-system-settings.png) - -Under `System variables`, the variable `Path`: - -![Environment Variables](./_static/images/screenshot-environment-variables.png) - ---- - -### Antivirus Performance Impact - -Does not apply to you if you do not use a third-party antivirus nor the default preinstalled antivirus on Windows. - -**Windows Defender or any other antivirus will have a significant impact on the speed you will be able to perform the steps.** It is recommended to **turn them off temporarily** until you finished with building and setting up everything, then turn them back on, if you are using them. - ---- - -## OpenCL SDK Installation - -Installing the appropriate OpenCL SDK requires you to download the correct vendor source SDK. You need to know on what you are going to use LightGBM!: - -* For running on Intel, get [Intel SDK for OpenCL](https://software.intel.com/en-us/articles/opencl-drivers) (NOT RECOMMENDED) -* For running on AMD, get [AMD APP SDK](http://developer.amd.com/amd-accelerated-parallel-processing-app-sdk/) -* For running on NVIDIA, get [CUDA Toolkit](https://developer.nvidia.com/cuda-downloads) - -Further reading and correspondnce table (especially if you intend to use cross-platform devices, like Intel CPU with AMD APP SDK): [GPU SDK Correspondence and Device Targeting Table](./GPU-Targets.rst). - -Warning: using Intel OpenCL is not recommended and may crash your machine due to being non compliant to OpenCL standards. If your objective is to use LightGBM + OpenCL on CPU, please use AMD APP SDK instead (it can run also on Intel CPUs without any issues). - ---- - -## MinGW Correct Compiler Selection - -If you are expecting to use LightGBM without R, you need to install MinGW. Installing MinGW is straightforward, download [this](http://iweb.dl.sourceforge.net/project/mingw-w64/Toolchains%20targetting%20Win32/Personal%20Builds/mingw-builds/installer/mingw-w64-install.exe). - -Make sure you are using the x86_64 architecture, and do not modify anything else. You may choose a version other than the most recent one if you need a previous MinGW version. - -![MinGW installation](./_static/images/screenshot-mingw-installation.png) - -Then, add to your PATH the following (to adjust to your MinGW version): - -``` -C:\Program Files\mingw-w64\x86_64-5.3.0-posix-seh-rt_v4-rev0\mingw64\bin -``` - -**Warning: R users (even if you do not want LightGBM for R)** - -**If you have RTools and MinGW installed, and wish to use LightGBM in R, get rid of MinGW from PATH (to keep: `c:\Rtools\bin;c:\Rtools\mingw_32\bin` for 32-bit R installation, `c:\Rtools\bin;c:\Rtools\mingw_64\bin` for 64-bit R installation).** - -You can check which MinGW version you are using by running the following in a command prompt: `gcc -v`: - -![R MinGW used](./_static/images/screenshot-r-mingw-used.png) - -To check whether you need 32-bit or 64-bit MinGW for R, install LightGBM as usual and check for the following: - -```r -* installing *source* package 'lightgbm' ... -** libs -c:/Rtools/mingw_64/bin/g++ -``` - -If it says `mingw_64` then you need the 64-bit version (PATH with `c:\Rtools\bin;c:\Rtools\mingw_64\bin`), otherwise you need the 32-bit version (`c:\Rtools\bin;c:\Rtools\mingw_32\bin`), the latter being a very rare and untested case. - -Quick installation of LightGBM can be done using: - -```r -devtools::install_github("Microsoft/LightGBM", subdir = "R-package") -``` - ---- - -## Boost Compilation - -Installing Boost requires to download Boost and to install it. It takes about 10 minutes to several hours depending on your CPU speed and network speed. - -We will assume an installation in `C:\boost` and a general installation (like in Unix variants: without versioning and without type tags). - -There is one mandatory step to check: the compiler. - -* **Warning: if you want the R installation**: If you have already MinGW in your PATH variable, get rid of it (you will link to the wrong compiler otherwise). -* **Warning: if you want the CLI installation**: if you have already Rtools in your PATH variable, get rid of it (you will link to the wrong compiler otherwise). - -* R installation must have Rtools in PATH -* CLI / Python installation must have MinGW (not Rtools) in PATH - -In addition, assuming you are going to use `C:\boost` for the folder path, you should add now already the following to PATH: `C:\boost\boost-build\bin;C:\boost\boost-build\include\boost`. Adjust `C:\boost` if you install it elsewhere. - -We can now start downloading and compiling the required Boost libraries: - -* Download Boost here: http://www.boost.org/users/history/version_1_63_0.html (boost_1_63_0.zip). -* Extract the archive to `C:\boost`. -* Open a command prompt, and run `cd C:\boost\boost_1_63_0\tools\build`. -* In command prompt, run `bootstrap.bat gcc`. -* In command prompt, run `b2 install --prefix="C:\boost\boost-build" toolset=gcc`. -* In command prompt, run `cd C:\boost\boost_1_63_0`. - -To build the Boost libraries, you have two choices for command prompt: - -* If you have only one single core, you can use the default - ``` - b2 install --build_dir="C:\boost\boost-build" --prefix="C:\boost\boost-build" toolset=gcc --with=filesystem,system threading=multi --layout=system release - ``` -* If you want to do a multithreaded library building (faster), add `-j N` by replacing N by the number of cores/threads you have. For instance, for 2 cores, you would do - ``` - b2 install --build_dir="C:\boost\boost-build" --prefix="C:\boost\boost-build" toolset=gcc --with=filesystem,system threading=multi --layout=system release -j 2 - ``` - -Ignore all the errors popping up, like Python, etc., they do not matter for us. - -Your folder should look like this at the end (not fully detailed): - -``` -- C - |--- boost - |------ boost_1_63_0 - |--------- some folders and files - |------ boost-build - |--------- bin - |--------- include - |------------ boost - |--------- lib - |--------- share -``` - -This is what you should (approximately) get at the end of Boost compilation: - -![Boost compiled](./_static/images/screenshot-boost-compiled.png) - -If you are getting an error: - -* Wipe your boost directory -* Close the command prompt -* Make sure you added `C:\boost\boost-build\bin;C:\boost\boost-build\include\boost` to your PATH (adjust accordingly if you use another folder) -* Do the boost compilation steps again (extract => command prompt => `cd` => `bootstrap` => `b2` => `cd` => `b2` - ---- - -## Git Installation - -Installing Git for Windows is straightforward, use the following [link](https://git-for-windows.github.io/). - -![git for Windows](./_static/images/screenshot-git-for-windows.png) - -Then, click on the big Download button, you can't miss it. - -Now, we can fetch LightGBM repository for GitHub. Run Git Bash and the following command: - -``` -cd C:/ -mkdir github_repos -cd github_repos -git clone --recursive https://github.com/Microsoft/LightGBM -``` - -Your LightGBM repository copy should now be under `C:\github_repos\LightGBM`. You are free to use any folder you want, but you have to adapt. - -Keep Git Bash open. - ---- - -## CMake Installation, Configuration, Generation - -**CLI / Python users only** - -Installing CMake requires one download first and then a lot of configuration for LightGBM: - -![Downloading CMake](./_static/images/screenshot-downloading-cmake.png) - -* Download CMake 3.8.0 here: https://cmake.org/download/. -* Install CMake. -* Run cmake-gui. -* Select the folder where you put LightGBM for `Where is the source code`, default using our steps would be `C:/github_repos/LightGBM`. -* Copy the folder name, and add `/build` for "Where to build the binaries", default using our steps would be `C:/github_repos/LightGBM/build`. -* Click `Configure`. - -![Create directory](./_static/images/screenshot-create-directory.png) - -![MinGW makefiles to use](./_static/images/screenshot-mingw-makefiles-to-use.png) - -* Lookup for `USE_GPU` and check the checkbox - -![Use GPU](./_static/images/screenshot-use-gpu.png) - -* Click `Configure` - -You should get (approximately) the following after clicking Configure: - -![Configured LightGBM](./_static/images/screenshot-configured-lightgbm.png) - -``` -Looking for CL_VERSION_2_0 -Looking for CL_VERSION_2_0 - found -Found OpenCL: C:/Windows/System32/OpenCL.dll (found version "2.0") -OpenCL include directory:C:/Program Files (x86)/AMD APP SDK/3.0/include -Boost version: 1.63.0 -Found the following Boost libraries: - filesystem - system -Configuring done -``` - -* Click `Generate` to get the following message: - -``` -Generating done -``` - -This is straightforward, as CMake is providing a large help into locating the correct elements. - ---- - -## LightGBM Compilation (CLI: final step) - -### Installation in CLI - -**CLI / Python users** - -Creating LightGBM libraries is very simple as all the important and hard steps were done before. - -You can do everything in the Git Bash console you left open: - -* If you closed Git Bash console previously, run this to get back to the build folder: `cd C:/github_repos/LightGBM/build` -* If you did not close the Git Bash console previously, run this to get to the build folder: `cd LightGBM/build` -* Setup MinGW as make using `alias make='mingw32-make'` (otherwise, beware error and name clash!). -* In Git Bash, run `make` and see LightGBM being installing! - -![LightGBM with GPU support compiled](./_static/images/screenshot-lightgbm-with-gpu-support-compiled.png) - -If everything was done correctly, you now compiled CLI LightGBM with GPU support! - -### Testing in CLI - -You can now test LightGBM directly in CLI in a **command prompt** (not Git Bash): - -``` -cd C:/github_repos/LightGBM/examples/binary_classification -"../../lightgbm.exe" config=train.conf data=binary.train valid=binary.test objective=binary device=gpu -``` - -![LightGBM in CLI with GPU](./_static/images/screenshot-lightgbm-in-cli-with-gpu.png) - -Congratulations for reaching this stage! - -To learn how to target a correct CPU or GPU for training, please see: [GPU SDK Correspondence and Device Targeting Table](./GPU-Targets.rst). - ---- - -## Debugging LightGBM Crashes in CLI - -Now that you compiled LightGBM, you try it... and you always see a segmentation fault or an undocumented crash with GPU support: - -![Segmentation Fault](./_static/images/screenshot-segmentation-fault.png) - -Please check you are using the right device and whether it works with the default `gpu_device_id = 0` and `gpu_platform_id = 0`. If it still does not work with the default values, then you should follow all the steps below. - -You will have to redo the compilation steps for LightGBM to add debugging mode. This involves: - -* Deleting `C:/github_repos/LightGBM/build` folder -* Deleting `lightgbm.exe`, `lib_lightgbm.dll`, and `lib_lightgbm.dll.a` files - -![Files to remove](./_static/images/screenshot-files-to-remove.png) - -Once you removed the file, go into CMake, and follow the usual steps. Before clicking "Generate", click on "Add Entry": - -![Added manual entry in CMake](./_static/images/screenshot-added-manual-entry-in-cmake.png) - -In addition, click on Configure and Generate: - -![Configured and Generated CMake](./_static/images/screenshot-configured-and-generated-cmake.png) - -And then, follow the regular LightGBM CLI installation from there. - -Once you have installed LightGBM CLI, assuming your LightGBM is in `C:\github_repos\LightGBM`, open a command prompt and run the following: - -``` -gdb --args "../../lightgbm.exe" config=train.conf data=binary.train valid=binary.test objective=binary device=gpu -``` - -![Debug run](./_static/images/screenshot-debug-run.png) - -Type `run` and Enter key. - -You will probably get something similar to this: - -``` -[LightGBM] [Info] This is the GPU trainer!! -[LightGBM] [Info] Total Bins 6143 -[LightGBM] [Info] Number of data: 7000, number of used features: 28 -[New Thread 105220.0x1a62c] -[LightGBM] [Info] Using GPU Device: Oland, Vendor: Advanced Micro Devices, Inc. -[LightGBM] [Info] Compiling OpenCL Kernel with 256 bins... - -Program received signal SIGSEGV, Segmentation fault. -0x00007ffbb37c11f1 in strlen () from C:\Windows\system32\msvcrt.dll -(gdb) -``` - -There, write `backtrace` and Enter key as many times as gdb requests two choices: - -``` -Program received signal SIGSEGV, Segmentation fault. -0x00007ffbb37c11f1 in strlen () from C:\Windows\system32\msvcrt.dll -(gdb) backtrace -#0 0x00007ffbb37c11f1 in strlen () from C:\Windows\system32\msvcrt.dll -#1 0x000000000048bbe5 in std::char_traits::length (__s=0x0) - at C:/PROGRA~1/MINGW-~1/X86_64~1.0-P/mingw64/x86_64-w64-mingw32/include/c++/bits/char_traits.h:267 -#2 std::operator+, std::allocator > (__rhs="\\", __lhs=0x0) - at C:/PROGRA~1/MINGW-~1/X86_64~1.0-P/mingw64/x86_64-w64-mingw32/include/c++/bits/basic_string.tcc:1157 -#3 boost::compute::detail::appdata_path[abi:cxx11]() () at C:/boost/boost-build/include/boost/compute/detail/path.hpp:38 -#4 0x000000000048eec3 in boost::compute::detail::program_binary_path (hash="d27987d5bd61e2d28cd32b8d7a7916126354dc81", create=create@entry=false) - at C:/boost/boost-build/include/boost/compute/detail/path.hpp:46 -#5 0x00000000004913de in boost::compute::program::load_program_binary (hash="d27987d5bd61e2d28cd32b8d7a7916126354dc81", ctx=...) - at C:/boost/boost-build/include/boost/compute/program.hpp:605 -#6 0x0000000000490ece in boost::compute::program::build_with_source ( - source="\n#ifndef _HISTOGRAM_256_KERNEL_\n#define _HISTOGRAM_256_KERNEL_\n\n#pragma OPENCL EXTENSION cl_khr_local_int32_base_atomics : enable\n#pragma OPENC -L EXTENSION cl_khr_global_int32_base_atomics : enable\n\n//"..., context=..., - options=" -D POWER_FEATURE_WORKGROUPS=5 -D USE_CONSTANT_BUF=0 -D USE_DP_FLOAT=0 -D CONST_HESSIAN=0 -cl-strict-aliasing -cl-mad-enable -cl-no-signed-zeros -c -l-fast-relaxed-math") at C:/boost/boost-build/include/boost/compute/program.hpp:549 -#7 0x0000000000454339 in LightGBM::GPUTreeLearner::BuildGPUKernels () at C:\LightGBM\src\treelearner\gpu_tree_learner.cpp:583 -#8 0x00000000636044f2 in libgomp-1!GOMP_parallel () from C:\Program Files\mingw-w64\x86_64-5.3.0-posix-seh-rt_v4-rev0\mingw64\bin\libgomp-1.dll -#9 0x0000000000455e7e in LightGBM::GPUTreeLearner::BuildGPUKernels (this=this@entry=0x3b9cac0) - at C:\LightGBM\src\treelearner\gpu_tree_learner.cpp:569 -#10 0x0000000000457b49 in LightGBM::GPUTreeLearner::InitGPU (this=0x3b9cac0, platform_id=, device_id=) - at C:\LightGBM\src\treelearner\gpu_tree_learner.cpp:720 -#11 0x0000000000410395 in LightGBM::GBDT::ResetTrainingData (this=0x1f26c90, config=, train_data=0x1f28180, objective_function=0x1f280e0, - training_metrics=std::vector of length 2, capacity 2 = {...}) at C:\LightGBM\src\boosting\gbdt.cpp:98 -#12 0x0000000000402e93 in LightGBM::Application::InitTrain (this=this@entry=0x23f9d0) at C:\LightGBM\src\application\application.cpp:213 ----Type to continue, or q to quit--- -#13 0x00000000004f0b55 in LightGBM::Application::Run (this=0x23f9d0) at C:/LightGBM/include/LightGBM/application.h:84 -#14 main (argc=6, argv=0x1f21e90) at C:\LightGBM\src\main.cpp:7 -``` - -Right-click the command prompt, click "Mark", and select all the text from the first line (with the command prompt containing gdb) to the last line printed, containing all the log, such as: - -``` -C:\LightGBM\examples\binary_classification>gdb --args "../../lightgbm.exe" config=train.conf data=binary.train valid=binary.test objective=binary device=gpu -GNU gdb (GDB) 7.10.1 -Copyright (C) 2015 Free Software Foundation, Inc. -License GPLv3+: GNU GPL version 3 or later -This is free software: you are free to change and redistribute it. -There is NO WARRANTY, to the extent permitted by law. Type "show copying" -and "show warranty" for details. -This GDB was configured as "x86_64-w64-mingw32". -Type "show configuration" for configuration details. -For bug reporting instructions, please see: -. -Find the GDB manual and other documentation resources online at: -. -For help, type "help". -Type "apropos word" to search for commands related to "word"... -Reading symbols from ../../lightgbm.exe...done. -(gdb) run -Starting program: C:\LightGBM\lightgbm.exe "config=train.conf" "data=binary.train" "valid=binary.test" "objective=binary" "device=gpu" -[New Thread 105220.0x199b8] -[New Thread 105220.0x783c] -[Thread 105220.0x783c exited with code 0] -[LightGBM] [Info] Finished loading parameters -[New Thread 105220.0x19490] -[New Thread 105220.0x1a71c] -[New Thread 105220.0x19a24] -[New Thread 105220.0x4fb0] -[Thread 105220.0x4fb0 exited with code 0] -[LightGBM] [Info] Loading weights... -[New Thread 105220.0x19988] -[Thread 105220.0x19988 exited with code 0] -[New Thread 105220.0x1a8fc] -[Thread 105220.0x1a8fc exited with code 0] -[LightGBM] [Info] Loading weights... -[New Thread 105220.0x1a90c] -[Thread 105220.0x1a90c exited with code 0] -[LightGBM] [Info] Finished loading data in 1.011408 seconds -[LightGBM] [Info] Number of positive: 3716, number of negative: 3284 -[LightGBM] [Info] This is the GPU trainer!! -[LightGBM] [Info] Total Bins 6143 -[LightGBM] [Info] Number of data: 7000, number of used features: 28 -[New Thread 105220.0x1a62c] -[LightGBM] [Info] Using GPU Device: Oland, Vendor: Advanced Micro Devices, Inc. -[LightGBM] [Info] Compiling OpenCL Kernel with 256 bins... - -Program received signal SIGSEGV, Segmentation fault. -0x00007ffbb37c11f1 in strlen () from C:\Windows\system32\msvcrt.dll -(gdb) backtrace -#0 0x00007ffbb37c11f1 in strlen () from C:\Windows\system32\msvcrt.dll -#1 0x000000000048bbe5 in std::char_traits::length (__s=0x0) - at C:/PROGRA~1/MINGW-~1/X86_64~1.0-P/mingw64/x86_64-w64-mingw32/include/c++/bits/char_traits.h:267 -#2 std::operator+, std::allocator > (__rhs="\\", __lhs=0x0) - at C:/PROGRA~1/MINGW-~1/X86_64~1.0-P/mingw64/x86_64-w64-mingw32/include/c++/bits/basic_string.tcc:1157 -#3 boost::compute::detail::appdata_path[abi:cxx11]() () at C:/boost/boost-build/include/boost/compute/detail/path.hpp:38 -#4 0x000000000048eec3 in boost::compute::detail::program_binary_path (hash="d27987d5bd61e2d28cd32b8d7a7916126354dc81", create=create@entry=false) - at C:/boost/boost-build/include/boost/compute/detail/path.hpp:46 -#5 0x00000000004913de in boost::compute::program::load_program_binary (hash="d27987d5bd61e2d28cd32b8d7a7916126354dc81", ctx=...) - at C:/boost/boost-build/include/boost/compute/program.hpp:605 -#6 0x0000000000490ece in boost::compute::program::build_with_source ( - source="\n#ifndef _HISTOGRAM_256_KERNEL_\n#define _HISTOGRAM_256_KERNEL_\n\n#pragma OPENCL EXTENSION cl_khr_local_int32_base_atomics : enable\n#pragma OPENC -L EXTENSION cl_khr_global_int32_base_atomics : enable\n\n//"..., context=..., - options=" -D POWER_FEATURE_WORKGROUPS=5 -D USE_CONSTANT_BUF=0 -D USE_DP_FLOAT=0 -D CONST_HESSIAN=0 -cl-strict-aliasing -cl-mad-enable -cl-no-signed-zeros -c -l-fast-relaxed-math") at C:/boost/boost-build/include/boost/compute/program.hpp:549 -#7 0x0000000000454339 in LightGBM::GPUTreeLearner::BuildGPUKernels () at C:\LightGBM\src\treelearner\gpu_tree_learner.cpp:583 -#8 0x00000000636044f2 in libgomp-1!GOMP_parallel () from C:\Program Files\mingw-w64\x86_64-5.3.0-posix-seh-rt_v4-rev0\mingw64\bin\libgomp-1.dll -#9 0x0000000000455e7e in LightGBM::GPUTreeLearner::BuildGPUKernels (this=this@entry=0x3b9cac0) - at C:\LightGBM\src\treelearner\gpu_tree_learner.cpp:569 -#10 0x0000000000457b49 in LightGBM::GPUTreeLearner::InitGPU (this=0x3b9cac0, platform_id=, device_id=) - at C:\LightGBM\src\treelearner\gpu_tree_learner.cpp:720 -#11 0x0000000000410395 in LightGBM::GBDT::ResetTrainingData (this=0x1f26c90, config=, train_data=0x1f28180, objective_function=0x1f280e0, - training_metrics=std::vector of length 2, capacity 2 = {...}) at C:\LightGBM\src\boosting\gbdt.cpp:98 -#12 0x0000000000402e93 in LightGBM::Application::InitTrain (this=this@entry=0x23f9d0) at C:\LightGBM\src\application\application.cpp:213 ----Type to continue, or q to quit--- -#13 0x00000000004f0b55 in LightGBM::Application::Run (this=0x23f9d0) at C:/LightGBM/include/LightGBM/application.h:84 -#14 main (argc=6, argv=0x1f21e90) at C:\LightGBM\src\main.cpp:7 -``` - -And open an issue in GitHub [here](https://github.com/Microsoft/LightGBM/issues) with that log. diff --git a/docs/GPU-Windows.rst b/docs/GPU-Windows.rst new file mode 100644 index 000000000..dd8ee36be --- /dev/null +++ b/docs/GPU-Windows.rst @@ -0,0 +1,565 @@ +GPU Windows Compilation +======================= + +This guide is for the MinGW build. + +For the MSVC (Visual Studio) build with GPU, please refer to `Installation Guide <./Installation-Guide.rst#build-gpu-version>`__. +(We recommend you to use this since it is much easier). + +Install LightGBM GPU version in Windows (CLI / R / Python), using MinGW/gcc +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +This is for a vanilla installation of Boost, including full compilation steps from source without precompiled libraries. + +Installation steps (depends on what you are going to do): + +- Install the appropriate OpenCL SDK + +- Install MinGW + +- Install Boost + +- Install Git + +- Install CMake + +- Create LightGBM binaries + +- Debugging LightGBM in CLI (if GPU is crashing or any other crash reason) + +If you wish to use another compiler like Visual Studio C++ compiler, you need to adapt the steps to your needs. + +For this compilation tutorial, we are using AMD SDK for our OpenCL steps. +However, you are free to use any OpenCL SDK you want, you just need to adjust the PATH correctly. + +You will also need administrator rights. This will not work without them. + +At the end, you can restore your original PATH. + +-------------- + +Modifying PATH (for newbies) +---------------------------- + +To modify PATH, just follow the pictures after going to the ``Control Panel``: + +.. image:: ./_static/images/screenshot-system.png + :align: center + +Then, go to ``Advanced`` > ``Environment Variables...``: + +.. image:: ./_static/images/screenshot-advanced-system-settings.png + :align: center + +Under ``System variables``, the variable ``Path``: + +.. image:: ./_static/images/screenshot-environment-variables.png + :align: center + +-------------- + +Antivirus Performance Impact +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Does not apply to you if you do not use a third-party antivirus nor the default preinstalled antivirus on Windows. + +**Windows Defender or any other antivirus will have a significant impact on the speed you will be able to perform the steps.** +It is recommended to **turn them off temporarily** until you finished with building and setting up everything, then turn them back on, if you are using them. + +-------------- + +OpenCL SDK Installation +----------------------- + +Installing the appropriate OpenCL SDK requires you to download the correct vendor source SDK. +You need to know on what you are going to use LightGBM!: + +- For running on Intel, get `Intel SDK for OpenCL`_ (NOT RECOMMENDED) + +- For running on AMD, get `AMD APP SDK`_ + +- For running on NVIDIA, get `CUDA Toolkit`_ + +Further reading and correspondnce table (especially if you intend to use cross-platform devices, +like Intel CPU with AMD APP SDK): `GPU SDK Correspondence and Device Targeting Table <./GPU-Targets.rst>`__. + +**Warning**: using Intel OpenCL is not recommended and may crash your machine due to being non compliant to OpenCL standards. +If your objective is to use LightGBM + OpenCL on CPU, please use AMD APP SDK instead (it can run also on Intel CPUs without any issues). + +-------------- + +MinGW Correct Compiler Selection +-------------------------------- + +If you are expecting to use LightGBM without R, you need to install MinGW. +Installing MinGW is straightforward, download `this`_. + +Make sure you are using the x86\_64 architecture, and do not modify anything else. +You may choose a version other than the most recent one if you need a previous MinGW version. + +.. image:: ./_static/images/screenshot-mingw-installation.png + :align: center + +Then, add to your PATH the following (to adjust to your MinGW version): + +:: + + C:\Program Files\mingw-w64\x86_64-5.3.0-posix-seh-rt_v4-rev0\mingw64\bin + +**Warning**: R users (even if you do not want LightGBM for R) + +If you have RTools and MinGW installed, and wish to use LightGBM in R, +get rid of MinGW from PATH (to keep: ``c:\Rtools\bin;c:\Rtools\mingw_32\bin`` for 32-bit R installation, +``c:\Rtools\bin;c:\Rtools\mingw_64\bin`` for 64-bit R installation). + +You can check which MinGW version you are using by running the following in a command prompt: ``gcc -v``: + +.. image:: ./_static/images/screenshot-r-mingw-used.png + :align: center + +To check whether you need 32-bit or 64-bit MinGW for R, install LightGBM as usual and check for the following: + +.. code:: r + + * installing *source* package 'lightgbm' ... + ** libs + c:/Rtools/mingw_64/bin/g++ + +If it says ``mingw_64`` then you need the 64-bit version (PATH with ``c:\Rtools\bin;c:\Rtools\mingw_64\bin``), +otherwise you need the 32-bit version (``c:\Rtools\bin;c:\Rtools\mingw_32\bin``), the latter being a very rare and untested case. + +Quick installation of LightGBM can be done using: + +.. code:: r + + devtools::install_github("Microsoft/LightGBM", subdir = "R-package") + +-------------- + +Boost Compilation +----------------- + +Installing Boost requires to download Boost and to install it. +It takes about 10 minutes to several hours depending on your CPU speed and network speed. + +We will assume an installation in ``C:\boost`` and a general installation (like in Unix variants: without versioning and without type tags). + +There is one mandatory step to check the compiler: + +- **Warning**: if you want the R installation: + If you have already MinGW in your PATH variable, get rid of it (you will link to the wrong compiler otherwise). + +- **Warning**: if you want the CLI installation: + If you have already Rtools in your PATH variable, get rid of it (you will link to the wrong compiler otherwise). + +- R installation must have Rtools in PATH + +- CLI / Python installation must have MinGW (not Rtools) in PATH + +In addition, assuming you are going to use ``C:\boost`` for the folder path, +you should add now already the following to PATH: ``C:\boost\boost-build\bin``, ``C:\boost\boost-build\include\boost``. +Adjust ``C:\boost`` if you install it elsewhere. + +We can now start downloading and compiling the required Boost libraries: + +- Download `Boost`_ (boost\_1\_63\_0.zip) + +- Extract the archive to ``C:\boost`` + +- Open a command prompt, and run + + .. code:: + + cd C:\boost\boost_1_63_0\tools\build + bootstrap.bat gcc + b2 install --prefix="C:\boost\boost-build" toolset=gcc + cd C:\boost\boost_1_63_0 + +To build the Boost libraries, you have two choices for command prompt: + +- If you have only one single core, you can use the default + + .. code:: + + b2 install --build_dir="C:\boost\boost-build" --prefix="C:\boost\boost-build" toolset=gcc --with=filesystem,system threading=multi --layout=system release + +- If you want to do a multithreaded library building (faster), add ``-j N`` by replacing N by the number of cores/threads you have. + For instance, for 2 cores, you would do + + .. code:: + + b2 install --build_dir="C:\boost\boost-build" --prefix="C:\boost\boost-build" toolset=gcc --with=filesystem,system threading=multi --layout=system release -j 2 + +Ignore all the errors popping up, like Python, etc., they do not matter for us. + +Your folder should look like this at the end (not fully detailed): + +:: + + - C + |--- boost + |------ boost_1_63_0 + |--------- some folders and files + |------ boost-build + |--------- bin + |--------- include + |------------ boost + |--------- lib + |--------- share + +This is what you should (approximately) get at the end of Boost compilation: + +.. image:: ./_static/images/screenshot-boost-compiled.png + :align: center + +If you are getting an error: + +- Wipe your boost directory + +- Close the command prompt + +- Make sure you added + ``C:\boost\boost-build\bin``, ``C:\boost\boost-build\include\boost`` to + your PATH (adjust accordingly if you use another folder) + +- Do the boost compilation steps again (extract => command prompt => ``cd`` => ``bootstrap`` => ``b2`` => ``cd`` => ``b2`` + +-------------- + +Git Installation +---------------- + +Installing Git for Windows is straightforward, use the following `link`_. + +.. image:: ./_static/images/screenshot-git-for-windows.png + :align: center + +Then, click on the big Download button, you can't miss it. + +Now, we can fetch LightGBM repository for GitHub. Run Git Bash and the following command: + +:: + + cd C:/ + mkdir github_repos + cd github_repos + git clone --recursive https://github.com/Microsoft/LightGBM + +Your LightGBM repository copy should now be under ``C:\github_repos\LightGBM``. +You are free to use any folder you want, but you have to adapt. + +Keep Git Bash open. + +-------------- + +CMake Installation, Configuration, Generation +--------------------------------------------- + +**CLI / Python users only** + +Installing CMake requires one download first and then a lot of configuration for LightGBM: + +.. image:: ./_static/images/screenshot-downloading-cmake.png + :align: center + +- Download `CMake`_ 3.8.0 + +- Install CMake + +- Run cmake-gui + +- Select the folder where you put LightGBM for ``Where is the source code``, + default using our steps would be ``C:/github_repos/LightGBM`` + +- Copy the folder name, and add ``/build`` for "Where to build the binaries", + default using our steps would be ``C:/github_repos/LightGBM/build`` + +- Click ``Configure`` + + .. image:: ./_static/images/screenshot-create-directory.png + :align: center + + .. image:: ./_static/images/screenshot-mingw-makefiles-to-use.png + :align: center + +- Lookup for ``USE_GPU`` and check the checkbox + + .. image:: ./_static/images/screenshot-use-gpu.png + :align: center + +- Click ``Configure`` + + You should get (approximately) the following after clicking Configure: + + .. image:: ./_static/images/screenshot-configured-lightgbm.png + :align: center + + :: + + Looking for CL_VERSION_2_0 + Looking for CL_VERSION_2_0 - found + Found OpenCL: C:/Windows/System32/OpenCL.dll (found version "2.0") + OpenCL include directory:C:/Program Files (x86)/AMD APP SDK/3.0/include + Boost version: 1.63.0 + Found the following Boost libraries: + filesystem + system + Configuring done + +- Click ``Generate`` to get the following message: + + :: + + Generating done + +This is straightforward, as CMake is providing a large help into locating the correct elements. + +-------------- + +LightGBM Compilation (CLI: final step) +-------------------------------------- + +Installation in CLI +~~~~~~~~~~~~~~~~~~~ + +**CLI / Python users** + +Creating LightGBM libraries is very simple as all the important and hard steps were done before. + +You can do everything in the Git Bash console you left open: + +- If you closed Git Bash console previously, run this to get back to the build folder: + + :: + + cd C:/github_repos/LightGBM/build + +- If you did not close the Git Bash console previously, run this to get to the build folder: + + :: + + cd LightGBM/build + +- Setup MinGW as ``make`` using + + :: + + alias make='mingw32-make' + + otherwise, beware error and name clash! + +- In Git Bash, run ``make`` and see LightGBM being installing! + +.. image:: ./_static/images/screenshot-lightgbm-with-gpu-support-compiled.png + :align: center + +If everything was done correctly, you now compiled CLI LightGBM with GPU support! + +Testing in CLI +~~~~~~~~~~~~~~ + +You can now test LightGBM directly in CLI in a **command prompt** (not Git Bash): + +:: + + cd C:/github_repos/LightGBM/examples/binary_classification + "../../lightgbm.exe" config=train.conf data=binary.train valid=binary.test objective=binary device=gpu + +.. image:: ./_static/images/screenshot-lightgbm-in-cli-with-gpu.png + :align: center + +Congratulations for reaching this stage! + +To learn how to target a correct CPU or GPU for training, please see: `GPU SDK Correspondence and Device Targeting Table <./GPU-Targets.rst>`__. + +-------------- + +Debugging LightGBM Crashes in CLI +--------------------------------- + +Now that you compiled LightGBM, you try it... and you always see a segmentation fault or an undocumented crash with GPU support: + +.. image:: ./_static/images/screenshot-segmentation-fault.png + :align: center + +Please check you are using the right device and whether it works with the default ``gpu_device_id = 0`` and ``gpu_platform_id = 0``. +If it still does not work with the default values, then you should follow all the steps below. + +You will have to redo the compilation steps for LightGBM to add debugging mode. This involves: + +- Deleting ``C:/github_repos/LightGBM/build`` folder + +- Deleting ``lightgbm.exe``, ``lib_lightgbm.dll``, and ``lib_lightgbm.dll.a`` files + +.. image:: ./_static/images/screenshot-files-to-remove.png + :align: center + +Once you removed the file, go into CMake, and follow the usual steps. +Before clicking "Generate", click on "Add Entry": + +.. image:: ./_static/images/screenshot-added-manual-entry-in-cmake.png + :align: center + +In addition, click on Configure and Generate: + +.. image:: ./_static/images/screenshot-configured-and-generated-cmake.png + :align: center + +And then, follow the regular LightGBM CLI installation from there. + +Once you have installed LightGBM CLI, assuming your LightGBM is in ``C:\github_repos\LightGBM``, +open a command prompt and run the following: + +:: + + gdb --args "../../lightgbm.exe" config=train.conf data=binary.train valid=binary.test objective=binary device=gpu + +.. image:: ./_static/images/screenshot-debug-run.png + :align: center + +Type ``run`` and press the Enter key. + +You will probably get something similar to this: + +:: + + [LightGBM] [Info] This is the GPU trainer!! + [LightGBM] [Info] Total Bins 6143 + [LightGBM] [Info] Number of data: 7000, number of used features: 28 + [New Thread 105220.0x1a62c] + [LightGBM] [Info] Using GPU Device: Oland, Vendor: Advanced Micro Devices, Inc. + [LightGBM] [Info] Compiling OpenCL Kernel with 256 bins... + + Program received signal SIGSEGV, Segmentation fault. + 0x00007ffbb37c11f1 in strlen () from C:\Windows\system32\msvcrt.dll + (gdb) + +There, write ``backtrace`` and press the Enter key as many times as gdb requests two choices: + +:: + + Program received signal SIGSEGV, Segmentation fault. + 0x00007ffbb37c11f1 in strlen () from C:\Windows\system32\msvcrt.dll + (gdb) backtrace + #0 0x00007ffbb37c11f1 in strlen () from C:\Windows\system32\msvcrt.dll + #1 0x000000000048bbe5 in std::char_traits::length (__s=0x0) + at C:/PROGRA~1/MINGW-~1/X86_64~1.0-P/mingw64/x86_64-w64-mingw32/include/c++/bits/char_traits.h:267 + #2 std::operator+, std::allocator > (__rhs="\\", __lhs=0x0) + at C:/PROGRA~1/MINGW-~1/X86_64~1.0-P/mingw64/x86_64-w64-mingw32/include/c++/bits/basic_string.tcc:1157 + #3 boost::compute::detail::appdata_path[abi:cxx11]() () at C:/boost/boost-build/include/boost/compute/detail/path.hpp:38 + #4 0x000000000048eec3 in boost::compute::detail::program_binary_path (hash="d27987d5bd61e2d28cd32b8d7a7916126354dc81", create=create@entry=false) + at C:/boost/boost-build/include/boost/compute/detail/path.hpp:46 + #5 0x00000000004913de in boost::compute::program::load_program_binary (hash="d27987d5bd61e2d28cd32b8d7a7916126354dc81", ctx=...) + at C:/boost/boost-build/include/boost/compute/program.hpp:605 + #6 0x0000000000490ece in boost::compute::program::build_with_source ( + source="\n#ifndef _HISTOGRAM_256_KERNEL_\n#define _HISTOGRAM_256_KERNEL_\n\n#pragma OPENCL EXTENSION cl_khr_local_int32_base_atomics : enable\n#pragma OPENC + L EXTENSION cl_khr_global_int32_base_atomics : enable\n\n//"..., context=..., + options=" -D POWER_FEATURE_WORKGROUPS=5 -D USE_CONSTANT_BUF=0 -D USE_DP_FLOAT=0 -D CONST_HESSIAN=0 -cl-strict-aliasing -cl-mad-enable -cl-no-signed-zeros -c + l-fast-relaxed-math") at C:/boost/boost-build/include/boost/compute/program.hpp:549 + #7 0x0000000000454339 in LightGBM::GPUTreeLearner::BuildGPUKernels () at C:\LightGBM\src\treelearner\gpu_tree_learner.cpp:583 + #8 0x00000000636044f2 in libgomp-1!GOMP_parallel () from C:\Program Files\mingw-w64\x86_64-5.3.0-posix-seh-rt_v4-rev0\mingw64\bin\libgomp-1.dll + #9 0x0000000000455e7e in LightGBM::GPUTreeLearner::BuildGPUKernels (this=this@entry=0x3b9cac0) + at C:\LightGBM\src\treelearner\gpu_tree_learner.cpp:569 + #10 0x0000000000457b49 in LightGBM::GPUTreeLearner::InitGPU (this=0x3b9cac0, platform_id=, device_id=) + at C:\LightGBM\src\treelearner\gpu_tree_learner.cpp:720 + #11 0x0000000000410395 in LightGBM::GBDT::ResetTrainingData (this=0x1f26c90, config=, train_data=0x1f28180, objective_function=0x1f280e0, + training_metrics=std::vector of length 2, capacity 2 = {...}) at C:\LightGBM\src\boosting\gbdt.cpp:98 + #12 0x0000000000402e93 in LightGBM::Application::InitTrain (this=this@entry=0x23f9d0) at C:\LightGBM\src\application\application.cpp:213 + ---Type to continue, or q to quit--- + #13 0x00000000004f0b55 in LightGBM::Application::Run (this=0x23f9d0) at C:/LightGBM/include/LightGBM/application.h:84 + #14 main (argc=6, argv=0x1f21e90) at C:\LightGBM\src\main.cpp:7 + +Right-click the command prompt, click "Mark", and select all the text from the first line (with the command prompt containing gdb) to the last line printed, containing all the log, such as: + +:: + + C:\LightGBM\examples\binary_classification>gdb --args "../../lightgbm.exe" config=train.conf data=binary.train valid=binary.test objective=binary device=gpu + GNU gdb (GDB) 7.10.1 + Copyright (C) 2015 Free Software Foundation, Inc. + License GPLv3+: GNU GPL version 3 or later + This is free software: you are free to change and redistribute it. + There is NO WARRANTY, to the extent permitted by law. Type "show copying" + and "show warranty" for details. + This GDB was configured as "x86_64-w64-mingw32". + Type "show configuration" for configuration details. + For bug reporting instructions, please see: + . + Find the GDB manual and other documentation resources online at: + . + For help, type "help". + Type "apropos word" to search for commands related to "word"... + Reading symbols from ../../lightgbm.exe...done. + (gdb) run + Starting program: C:\LightGBM\lightgbm.exe "config=train.conf" "data=binary.train" "valid=binary.test" "objective=binary" "device=gpu" + [New Thread 105220.0x199b8] + [New Thread 105220.0x783c] + [Thread 105220.0x783c exited with code 0] + [LightGBM] [Info] Finished loading parameters + [New Thread 105220.0x19490] + [New Thread 105220.0x1a71c] + [New Thread 105220.0x19a24] + [New Thread 105220.0x4fb0] + [Thread 105220.0x4fb0 exited with code 0] + [LightGBM] [Info] Loading weights... + [New Thread 105220.0x19988] + [Thread 105220.0x19988 exited with code 0] + [New Thread 105220.0x1a8fc] + [Thread 105220.0x1a8fc exited with code 0] + [LightGBM] [Info] Loading weights... + [New Thread 105220.0x1a90c] + [Thread 105220.0x1a90c exited with code 0] + [LightGBM] [Info] Finished loading data in 1.011408 seconds + [LightGBM] [Info] Number of positive: 3716, number of negative: 3284 + [LightGBM] [Info] This is the GPU trainer!! + [LightGBM] [Info] Total Bins 6143 + [LightGBM] [Info] Number of data: 7000, number of used features: 28 + [New Thread 105220.0x1a62c] + [LightGBM] [Info] Using GPU Device: Oland, Vendor: Advanced Micro Devices, Inc. + [LightGBM] [Info] Compiling OpenCL Kernel with 256 bins... + + Program received signal SIGSEGV, Segmentation fault. + 0x00007ffbb37c11f1 in strlen () from C:\Windows\system32\msvcrt.dll + (gdb) backtrace + #0 0x00007ffbb37c11f1 in strlen () from C:\Windows\system32\msvcrt.dll + #1 0x000000000048bbe5 in std::char_traits::length (__s=0x0) + at C:/PROGRA~1/MINGW-~1/X86_64~1.0-P/mingw64/x86_64-w64-mingw32/include/c++/bits/char_traits.h:267 + #2 std::operator+, std::allocator > (__rhs="\\", __lhs=0x0) + at C:/PROGRA~1/MINGW-~1/X86_64~1.0-P/mingw64/x86_64-w64-mingw32/include/c++/bits/basic_string.tcc:1157 + #3 boost::compute::detail::appdata_path[abi:cxx11]() () at C:/boost/boost-build/include/boost/compute/detail/path.hpp:38 + #4 0x000000000048eec3 in boost::compute::detail::program_binary_path (hash="d27987d5bd61e2d28cd32b8d7a7916126354dc81", create=create@entry=false) + at C:/boost/boost-build/include/boost/compute/detail/path.hpp:46 + #5 0x00000000004913de in boost::compute::program::load_program_binary (hash="d27987d5bd61e2d28cd32b8d7a7916126354dc81", ctx=...) + at C:/boost/boost-build/include/boost/compute/program.hpp:605 + #6 0x0000000000490ece in boost::compute::program::build_with_source ( + source="\n#ifndef _HISTOGRAM_256_KERNEL_\n#define _HISTOGRAM_256_KERNEL_\n\n#pragma OPENCL EXTENSION cl_khr_local_int32_base_atomics : enable\n#pragma OPENCL EXTENSION cl_khr_global_int32_base_atomics : enable\n\n//"..., context=..., + options=" -D POWER_FEATURE_WORKGROUPS=5 -D USE_CONSTANT_BUF=0 -D USE_DP_FLOAT=0 -D CONST_HESSIAN=0 -cl-strict-aliasing -cl-mad-enable -cl-no-signed-zeros -cl-fast-relaxed-math") at C:/boost/boost-build/include/boost/compute/program.hpp:549 + #7 0x0000000000454339 in LightGBM::GPUTreeLearner::BuildGPUKernels () at C:\LightGBM\src\treelearner\gpu_tree_learner.cpp:583 + #8 0x00000000636044f2 in libgomp-1!GOMP_parallel () from C:\Program Files\mingw-w64\x86_64-5.3.0-posix-seh-rt_v4-rev0\mingw64\bin\libgomp-1.dll + #9 0x0000000000455e7e in LightGBM::GPUTreeLearner::BuildGPUKernels (this=this@entry=0x3b9cac0) + at C:\LightGBM\src\treelearner\gpu_tree_learner.cpp:569 + #10 0x0000000000457b49 in LightGBM::GPUTreeLearner::InitGPU (this=0x3b9cac0, platform_id=, device_id=) + at C:\LightGBM\src\treelearner\gpu_tree_learner.cpp:720 + #11 0x0000000000410395 in LightGBM::GBDT::ResetTrainingData (this=0x1f26c90, config=, train_data=0x1f28180, objective_function=0x1f280e0, + training_metrics=std::vector of length 2, capacity 2 = {...}) at C:\LightGBM\src\boosting\gbdt.cpp:98 + #12 0x0000000000402e93 in LightGBM::Application::InitTrain (this=this@entry=0x23f9d0) at C:\LightGBM\src\application\application.cpp:213 + ---Type to continue, or q to quit--- + #13 0x00000000004f0b55 in LightGBM::Application::Run (this=0x23f9d0) at C:/LightGBM/include/LightGBM/application.h:84 + #14 main (argc=6, argv=0x1f21e90) at C:\LightGBM\src\main.cpp:7 + +And open an issue in GitHub `here`_ with that log. + +.. _Intel SDK for OpenCL: https://software.intel.com/en-us/articles/opencl-drivers + +.. _AMD APP SDK: http://developer.amd.com/amd-accelerated-parallel-processing-app-sdk/ + +.. _CUDA Toolkit: https://developer.nvidia.com/cuda-downloads + +.. _this: http://iweb.dl.sourceforge.net/project/mingw-w64/Toolchains%20targetting%20Win32/Personal%20Builds/mingw-builds/installer/mingw-w64-install.exe + +.. _Boost: http://www.boost.org/users/history/version_1_63_0.html + +.. _link: https://git-for-windows.github.io/ + +.. _CMake: https://cmake.org/download/ + +.. _here: https://github.com/Microsoft/LightGBM/issues diff --git a/docs/Installation-Guide.rst b/docs/Installation-Guide.rst index ab2def8dc..67ab9702d 100644 --- a/docs/Installation-Guide.rst +++ b/docs/Installation-Guide.rst @@ -31,7 +31,7 @@ The exe file will be in ``LightGBM-master/windows/x64/Release`` folder. From Command Line ***************** -1. Install `Git for Windows`_, `CMake`_ (3.8 or higher) and `MSBuild`_ (MSbuild is not needed if **Visual Studio** is installed). +1. Install `Git for Windows`_, `CMake`_ (3.8 or higher) and `MSBuild`_ (**MSBuild** is not needed if **Visual Studio** is installed). 2. Run the following commands: @@ -66,10 +66,12 @@ The exe and dll files will be in ``LightGBM/`` folder. **Note**: you may need to run the ``cmake -G "MinGW Makefiles" ..`` one more time if met ``sh.exe was found in your PATH`` error. +Also you may want to reed `gcc Tips <./gcc-Tips.rst>`__. + Linux ~~~~~ -LightGBM uses ``CMake`` to build. Run the following commands: +LightGBM uses **CMake** to build. Run the following commands: .. code:: @@ -80,6 +82,8 @@ LightGBM uses ``CMake`` to build. Run the following commands: **Note**: glibc >= 2.14 is required. +Also you may want to reed `gcc Tips <./gcc-Tips.rst>`__. + OSX ~~~ @@ -102,6 +106,8 @@ Then install LightGBM: cmake .. make -j4 +Also you may want to reed `gcc Tips <./gcc-Tips.rst>`__. + Docker ~~~~~~ @@ -129,7 +135,7 @@ With GUI 4. Go to ``LightGBM-master/windows`` folder. -4. Open ``LightGBM.sln`` file with Visual Studio, choose ``Release_mpi`` configuration and click ``BUILD-> Build Solution (Ctrl+Shift+B)``. +5. Open ``LightGBM.sln`` file with Visual Studio, choose ``Release_mpi`` configuration and click ``BUILD-> Build Solution (Ctrl+Shift+B)``. If you have errors about **Platform Toolset**, go to ``PROJECT-> Properties-> Configuration Properties-> General`` and select the toolset installed on your machine. @@ -140,7 +146,7 @@ From Command Line 1. You need to install `MS MPI`_ first. Both ``msmpisdk.msi`` and ``MSMpiSetup.exe`` are needed. -2. Install `Git for Windows`_, `CMake`_ (3.8 or higher) and `MSBuild`_ (MSbuild is not needed if **Visual Studio** is installed). +2. Install `Git for Windows`_, `CMake`_ (3.8 or higher) and `MSBuild`_ (MSBuild is not needed if **Visual Studio** is installed). 3. Run the following commands: @@ -226,11 +232,11 @@ To build LightGBM GPU version, run the following commands: Windows ^^^^^^^ -If you use **MinGW**, the build procedure are similar to the build in Linux. Refer to `GPU Windows Compilation <./GPU-Windows.md>`__ to get more details. +If you use **MinGW**, the build procedure are similar to the build in Linux. Refer to `GPU Windows Compilation <./GPU-Windows.rst>`__ to get more details. -Following procedure is for the MSVC(Microsoft Visual C++) build. +Following procedure is for the MSVC (Microsoft Visual C++) build. -1. Install `Git for Windows`_, `CMake`_ (3.8 or higher) and `MSBuild`_ (MSbuild is not needed if **Visual Studio** is installed). +1. Install `Git for Windows`_, `CMake`_ (3.8 or higher) and `MSBuild`_ (MSBuild is not needed if **Visual Studio** is installed). 2. Install **OpenCL** for Windows. The installation depends on the brand (NVIDIA, AMD, Intel) of your GPU card. diff --git a/docs/Parallel-Learning-Guide.rst b/docs/Parallel-Learning-Guide.rst index 3d88b038a..1a5a89543 100644 --- a/docs/Parallel-Learning-Guide.rst +++ b/docs/Parallel-Learning-Guide.rst @@ -3,7 +3,7 @@ Parallel Learning Guide This is a guide for parallel learning of LightGBM. -Follow the `Quick Start`_ to know how to use LightGBM first. +Follow the `Quick Start <./Quick-Start.rst>`__ to know how to use LightGBM first. Choose Appropriate Parallel Algorithm ------------------------------------- @@ -30,14 +30,14 @@ These algorithms are suited for different scenarios, which is listed in the foll | **#feature is large** | Feature Parallel | Voting Parallel | +-------------------------+----------------------+----------------------+ -More details about these parallel algorithms can be found in `optimization in parallel learning`_. +More details about these parallel algorithms can be found in `optimization in parallel learning <./Features.rst#optimization-in-parallel-learning>`__. Build Parallel Version ---------------------- Default build version support parallel learning based on the socket. -If you need to build parallel version with MPI support, please refer to `Installation Guide`_. +If you need to build parallel version with MPI support, please refer to `Installation Guide <./Installation-Guide.rst#build-mpi-version>`__. Preparation ----------- @@ -64,7 +64,7 @@ Then write these IP in one file (assume ``mlist.txt``) like following: machine1_ip machine2_ip -Note: For Windows users, need to start "smpd" to start MPI service. More details can be found `here`_. +**Note**: For Windows users, need to start "smpd" to start MPI service. More details can be found `here`_. Run Parallel Learning --------------------- @@ -74,49 +74,53 @@ Socket Version 1. Edit following parameters in config file: -``tree_learner=your_parallel_algorithm``, edit ``your_parallel_algorithm`` (e.g. feature/data) here. + ``tree_learner=your_parallel_algorithm``, edit ``your_parallel_algorithm`` (e.g. feature/data) here. -``num_machines=your_num_machines``, edit ``your_num_machines`` (e.g. 4) here. + ``num_machines=your_num_machines``, edit ``your_num_machines`` (e.g. 4) here. -``machine_list_file=mlist.txt``, ``mlist.txt`` is created in `Preparation section <#preparation>`__. + ``machine_list_file=mlist.txt``, ``mlist.txt`` is created in `Preparation section <#preparation>`__. -``local_listen_port=12345``, ``12345`` is allocated in `Preparation section <#preparation>`__. + ``local_listen_port=12345``, ``12345`` is allocated in `Preparation section <#preparation>`__. 2. Copy data file, executable file, config file and ``mlist.txt`` to all machines. 3. Run following command on all machines, you need to change ``your_config_file`` to real config file. -For Windows: ``lightgbm.exe config=your_config_file`` + For Windows: ``lightgbm.exe config=your_config_file`` -For Linux: ``./lightgbm config=your_config_file`` + For Linux: ``./lightgbm config=your_config_file`` MPI Version ^^^^^^^^^^^ 1. Edit following parameters in config file: -``tree_learner=your_parallel_algorithm``, edit ``your_parallel_algorithm`` (e.g. feature/data) here. + ``tree_learner=your_parallel_algorithm``, edit ``your_parallel_algorithm`` (e.g. feature/data) here. -``num_machines=your_num_machines``, edit ``your_num_machines`` (e.g. 4) here. + ``num_machines=your_num_machines``, edit ``your_num_machines`` (e.g. 4) here. -2. Copy data file, executable file, config file and ``mlist.txt`` to all machines. Note: MPI needs to be run in the **same path on all machines**. +2. Copy data file, executable file, config file and ``mlist.txt`` to all machines. + + **Note**: MPI needs to be run in the **same path on all machines**. 3. Run following command on one machine (not need to run on all machines), need to change ``your_config_file`` to real config file. -For Windows: ``mpiexec.exe /machinefile mlist.txt lightgbm.exe config=your_config_file`` + For Windows: + + .. code:: -For Linux: ``mpiexec --machinefile mlist.txt ./lightgbm config=your_config_file`` + mpiexec.exe /machinefile mlist.txt lightgbm.exe config=your_config_file + + For Linux: + + .. code:: + + mpiexec --machinefile mlist.txt ./lightgbm config=your_config_file Example ^^^^^^^ -- `A simple parallel example`_. - -.. _Quick Start: ./Quick-Start.md - -.. _optimization in parallel learning: ./Features.md - -.. _Installation Guide: ./Installation-Guide.rst +- `A simple parallel example`_ .. _here: https://blogs.technet.microsoft.com/windowshpc/2015/02/02/how-to-compile-and-run-a-simple-ms-mpi-program/ diff --git a/docs/Parameters-Tuning.rst b/docs/Parameters-Tuning.rst new file mode 100644 index 000000000..57b419a57 --- /dev/null +++ b/docs/Parameters-Tuning.rst @@ -0,0 +1,80 @@ +Parameters Tuning +================= + +This is a page contains all parameters in LightGBM. + +**List of other helpful links** + +- `Parameters <./Parameters.rst>`__ +- `Python API <./Python-API.rst>`__ + +Tune Parameters for the Leaf-wise (Best-first) Tree +--------------------------------------------------- + +LightGBM uses the `leaf-wise <./Features.rst#leaf-wise-best-first-tree-growth>`__ tree growth algorithm, while many other popular tools use depth-wise tree growth. +Compared with depth-wise growth, the leaf-wise algorithm can convenge much faster. +However, the leaf-wise growth may be over-fitting if not used with the appropriate parameters. + +To get good results using a leaf-wise tree, these are some important parameters: + +1. ``num_leaves``. This is the main parameter to control the complexity of the tree model. + Theoretically, we can set ``num_leaves = 2^(max_depth)`` to convert from depth-wise tree. + However, this simple conversion is not good in practice. + The reason is, when number of leaves are the same, the leaf-wise tree is much deeper than depth-wise tree. As a result, it may be over-fitting. + Thus, when trying to tune the ``num_leaves``, we should let it be smaller than ``2^(max_depth)``. + For example, when the ``max_depth=6`` the depth-wise tree can get good accuracy, + but setting ``num_leaves`` to ``127`` may cause over-fitting, and setting it to ``70`` or ``80`` may get better accuracy than depth-wise. + Actually, the concept ``depth`` can be forgotten in leaf-wise tree, since it doesn't have a correct mapping from ``leaves`` to ``depth``. + +2. ``min_data_in_leaf``. This is a very important parameter to deal with over-fitting in leaf-wise tree. + Its value depends on the number of training data and ``num_leaves``. + Setting it to a large value can avoid growing too deep a tree, but may cause under-fitting. + In practice, setting it to hundreds or thousands is enough for a large dataset. + +3. ``max_depth``. You also can use ``max_depth`` to limit the tree depth explicitly. + +For Faster Speed +---------------- + +- Use bagging by setting ``bagging_fraction`` and ``bagging_freq`` + +- Use feature sub-sampling by setting ``feature_fraction`` + +- Use small ``max_bin`` + +- Use ``save_binary`` to speed up data loading in future learning + +- Use parallel learning, refer to `Parallel Learning Guide <./Parallel-Learning-Guide.rst>`__ + + +For Better Accuracy +------------------- + +- Use large ``max_bin`` (may be slower) + +- Use small ``learning_rate`` with large ``num_iterations`` + +- Use large ``num_leaves`` (may cause over-fitting) + +- Use bigger training data + +- Try ``dart`` + +Deal with Over-fitting +---------------------- + +- Use small ``max_bin`` + +- Use small ``num_leaves`` + +- Use ``min_data_in_leaf`` and ``min_sum_hessian_in_leaf`` + +- Use bagging by set ``bagging_fraction`` and ``bagging_freq`` + +- Use feature sub-sampling by set ``feature_fraction`` + +- Use bigger training data + +- Try ``lambda_l1``, ``lambda_l2`` and ``min_gain_to_split`` for regularization + +- Try ``max_depth`` to avoid growing deep tree diff --git a/docs/Parameters-tuning.md b/docs/Parameters-tuning.md deleted file mode 100644 index ab08f26bd..000000000 --- a/docs/Parameters-tuning.md +++ /dev/null @@ -1,47 +0,0 @@ -# Parameters Tuning - -This is a page contains all parameters in LightGBM. - -***List of other Helpful Links*** -* [Parameters](./Parameters.md) -* [Python API](./Python-API.rst) - -## Tune Parameters for the Leaf-wise (Best-first) Tree - -LightGBM uses the [leaf-wise](./Features.md) tree growth algorithm, while many other popular tools use depth-wise tree growth. Compared with depth-wise growth, the leaf-wise algorithm can convenge much faster. However, the leaf-wise growth may be over-fitting if not used with the appropriate parameters. - -To get good results using a leaf-wise tree, these are some important parameters: - -1. ```num_leaves```. This is the main parameter to control the complexity of the tree model. Theoretically, we can set ```num_leaves = 2^(max_depth) ``` to convert from depth-wise tree. However, this simple conversion is not good in practice. The reason is, when number of leaves are the same, the leaf-wise tree is much deeper than depth-wise tree. As a result, it may be over-fitting. Thus, when trying to tune the ```num_leaves```, we should let it be smaller than ```2^(max_depth)```. For example, when the ```max_depth=6``` the depth-wise tree can get good accuracy, but setting ```num_leaves``` to ```127``` may cause over-fitting, and setting it to ```70``` or ```80``` may get better accuracy than depth-wise. Actually, the concept ```depth``` can be forgotten in leaf-wise tree, since it doesn't have a correct mapping from ```leaves``` to ```depth```. - -2. ```min_data_in_leaf```. This is a very important parameter to deal with over-fitting in leaf-wise tree. Its value depends on the number of training data and ```num_leaves```. Setting it to a large value can avoid growing too deep a tree, but may cause under-fitting. In practice, setting it to hundreds or thousands is enough for a large dataset. - -3. ```max_depth```. You also can use ```max_depth``` to limit the tree depth explicitly. - - -## For Faster Speed - -* Use bagging by setting ```bagging_fraction``` and ```bagging_freq``` -* Use feature sub-sampling by setting ```feature_fraction``` -* Use small ```max_bin``` -* Use ```save_binary``` to speed up data loading in future learning -* Use parallel learning, refer to [Parallel Learning Guide](./Parallel-Learning-Guide.rst). - -## For Better Accuracy - -* Use large ```max_bin``` (may be slower) -* Use small ```learning_rate``` with large ```num_iterations``` -* Use large ```num_leaves```(may cause over-fitting) -* Use bigger training data -* Try ```dart``` - -## Deal with Over-fitting - -* Use small ```max_bin``` -* Use small ```num_leaves``` -* Use ```min_data_in_leaf``` and ```min_sum_hessian_in_leaf``` -* Use bagging by set ```bagging_fraction``` and ```bagging_freq``` -* Use feature sub-sampling by set ```feature_fraction``` -* Use bigger training data -* Try ```lambda_l1```, ```lambda_l2``` and ```min_gain_to_split``` to regularization -* Try ```max_depth``` to avoid growing deep tree diff --git a/docs/Parameters.md b/docs/Parameters.md deleted file mode 100644 index 00f3ccb81..000000000 --- a/docs/Parameters.md +++ /dev/null @@ -1,374 +0,0 @@ -# Parameters - -This is a page contains all parameters in LightGBM. - -***List of other Helpful Links*** -* [Python API](./Python-API.rst) -* [Parameters Tuning](./Parameters-tuning.md) - -***External Links*** -* [Laurae++ Interactive Documentation](https://sites.google.com/view/lauraepp/parameters) - -***Update of 08/04/2017*** - -Default values for the following parameters have changed: - -* min_data_in_leaf = 100 => 20 -* min_sum_hessian_in_leaf = 10 => 1e-3 -* num_leaves = 127 => 31 -* num_iterations = 10 => 100 - -## Parameter Format - -The parameter format is `key1=value1 key2=value2 ... ` . And parameters can be set both in config file and command line. By using command line, parameters should not have spaces before and after `=`. By using config files, one line can only contain one parameter. you can use `#` to comment. If one parameter appears in both command line and config file, LightGBM will use the parameter in command line. - -## Core Parameters - -* `config`, default=`""`, type=string, alias=`config_file` - * path of config file -* `task`, default=`train`, type=enum, options=`train`,`prediction` - * `train` for training - * `prediction` for prediction. - * `convert_model` for converting model file into if-else format, see more information in [Convert model parameters](#convert-model-parameters) -* `application`, default=`regression`, type=enum, options=`regression`,`regression_l1`,`huber`,`fair`,`poisson`,`binary`,`lambdarank`,`multiclass`, alias=`objective`,`app` - * `regression`, regression application - * `regression_l2`, L2 loss, alias=`mean_squared_error`,`mse` - * `regression_l1`, L1 loss, alias=`mean_absolute_error`,`mae` - * `huber`, [Huber loss](https://en.wikipedia.org/wiki/Huber_loss "Huber loss - Wikipedia") - * `fair`, [Fair loss](https://www.kaggle.com/c/allstate-claims-severity/discussion/24520) - * `poisson`, [Poisson regression](https://en.wikipedia.org/wiki/Poisson_regression "Poisson regression") - * `binary`, binary classification application - * `lambdarank`, [lambdarank](https://papers.nips.cc/paper/2971-learning-to-rank-with-nonsmooth-cost-functions.pdf) application - * The label should be `int` type in lambdarank tasks, and larger number represent the higher relevance (e.g. 0:bad, 1:fair, 2:good, 3:perfect). - * `label_gain` can be used to set the gain(weight) of `int` label. - * `multiclass`, multi-class classification application, should set `num_class` as well -* `boosting`, default=`gbdt`, type=enum, options=`gbdt`,`rf`,`dart`,`goss`, alias=`boost`,`boosting_type` - * `gbdt`, traditional Gradient Boosting Decision Tree - * `rf`, Random Forest - * `dart`, [Dropouts meet Multiple Additive Regression Trees](https://arxiv.org/abs/1505.01866) - * `goss`, Gradient-based One-Side Sampling -* `data`, default=`""`, type=string, alias=`train`,`train_data` - * training data, LightGBM will train from this data -* `valid`, default=`""`, type=multi-string, alias=`test`,`valid_data`,`test_data` - * validation/test data, LightGBM will output metrics for these data - * support multi validation data, separate by `,` -* `num_iterations`, default=`100`, type=int, alias=`num_iteration`,`num_tree`,`num_trees`,`num_round`,`num_rounds` - * number of boosting iterations - * note: For python/R package, **this parameter is ignored**, use `num_boost_round` (Python) or `nrounds` (R) input arguments of `train` and `cv` methods instead - * note: internally, LightGBM constructs `num_class * num_iterations` trees for `multiclass` problems -* `learning_rate`, default=`0.1`, type=double, alias=`shrinkage_rate` - * shrinkage rate - * in `dart`, it also affects normalization weights of dropped trees -* `num_leaves`, default=`31`, type=int, alias=`num_leaf` - * number of leaves in one tree -* `tree_learner`, default=`serial`, type=enum, options=`serial`,`feature`,`data` - * `serial`, single machine tree learner - * `feature`, feature parallel tree learner - * `data`, data parallel tree learner - * Refer to [Parallel Learning Guide](./Parallel-Learning-Guide.rst) to get more details. -* `num_threads`, default=OpenMP_default, type=int, alias=`num_thread`,`nthread` - * Number of threads for LightGBM. - * For the best speed, set this to the number of **real CPU cores**, not the number of threads (most CPU using [hyper-threading](https://en.wikipedia.org/wiki/Hyper-threading) to generate 2 threads per CPU core). - * Do not set it too large if your dataset is small (do not use 64 threads for a dataset with 10,000 for instance). - * Be aware a task manager or any similar CPU monitoring tool might report cores not being fully utilized. This is normal. - * For parallel learning, should not use full CPU cores since this will cause poor performance for the network. -* `device`, default=`cpu`, options=`cpu`,`gpu` - * Choose device for the tree learning, can use gpu to achieve the faster learning. - * Note: 1. Recommend use the smaller `max_bin`(e.g `63`) to get the better speed up. 2. For the faster speed, GPU use 32-bit float point to sum up by default, may affect the accuracy for some tasks. You can set `gpu_use_dp=true` to enable 64-bit float point, but it will slow down the training. 3. Refer to [Installation Guide](./Installation-Guide.rst) to build with GPU . - - -## Learning Control Parameters - -* `max_depth`, default=`-1`, type=int - * Limit the max depth for tree model. This is used to deal with overfit when #data is small. Tree still grow by leaf-wise. - * `< 0` means no limit -* `min_data_in_leaf`, default=`20`, type=int, alias=`min_data_per_leaf` , `min_data` - * Minimal number of data in one leaf. Can use this to deal with over-fit. -* `min_sum_hessian_in_leaf`, default=`1e-3`, type=double, alias=`min_sum_hessian_per_leaf`, `min_sum_hessian`, `min_hessian` - * Minimal sum hessian in one leaf. Like `min_data_in_leaf`, can use this to deal with over-fit. -* `feature_fraction`, default=`1.0`, type=double, `0.0 < feature_fraction < 1.0`, alias=`sub_feature` - * LightGBM will random select part of features on each iteration if `feature_fraction` smaller than `1.0`. For example, if set to `0.8`, will select 80% features before training each tree. - * Can use this to speed up training - * Can use this to deal with over-fit -* `feature_fraction_seed`, default=`2`, type=int - * Random seed for feature fraction. -* `bagging_fraction`, default=`1.0`, type=double, , `0.0 < bagging_fraction < 1.0`, alias=`sub_row` - * Like `feature_fraction`, but this will random select part of data without resampling - * Can use this to speed up training - * Can use this to deal with over-fit - * Note: To enable bagging, should set `bagging_freq` to a non zero value as well -* `bagging_freq`, default=`0`, type=int - * Frequency for bagging, `0` means disable bagging. `k` means will perform bagging at every `k` iteration. - * Note: To enable bagging, should set `bagging_fraction` as well -* `bagging_seed` , default=`3`, type=int - * Random seed for bagging. -* `early_stopping_round` , default=`0`, type=int, alias=`early_stopping_rounds`,`early_stopping` - * Will stop training if one metric of one validation data doesn't improve in last `early_stopping_round` rounds. -* `lambda_l1` , default=`0`, type=double - * l1 regularization -* `lambda_l2` , default=`0`, type=double - * l2 regularization -* `min_gain_to_split` , default=`0`, type=double - * The minimal gain to perform split -* `drop_rate`, default=`0.1`, type=double - * only used in `dart` -* `skip_drop`, default=`0.5`, type=double - * only used in `dart`, probability of skipping drop -* `max_drop`, default=`50`, type=int - * only used in `dart`, max number of dropped trees on one iteration. `<=0` means no limit. -* `uniform_drop`, default=`false`, type=bool - * only used in `dart`, true if want to use uniform drop -* `xgboost_dart_mode`, default=`false`, type=bool - * only used in `dart`, true if want to use xgboost dart mode -* `drop_seed`, default=`4`, type=int - * only used in `dart`, used to random seed to choose dropping models. -* `top_rate`, default=`0.2`, type=double - * only used in `goss`, the retain ratio of large gradient data -* `other_rate`, default=`0.1`, type=int - * only used in `goss`, the retain ratio of small gradient data -* `max_cat_group`, default=`64`, type=int - * use for the categorical features. - * When #catogory is large, finding the split point on it is easily over-fitting. So LightGBM merges them into `max_cat_group` groups, and finds the split points on the group boundaries. -* `min_data_per_group`, default=`10`, type=int - * Min number of data per categorical group. -* `max_cat_threshold`, default=`256`, type=int - * use for the categorical features. Limit the max threshold points in categorical features. -* `min_cat_smooth`, default=`5`, type=double - * use for the categorical features. Refer to the descrption in paramater `cat_smooth_ratio`. -* `max_cat_smooth`, default=`100`, type=double - * use for the categorical features. Refer to the descrption in paramater `cat_smooth_ratio`. -* `cat_smooth_ratio`, default=`0.01`, type=double - * use for the categorical features. This can reduce the effect of noises in categorical features, especially for categories with few data. - * The smooth denominator is `a = min(max_cat_smooth, max(min_cat_smooth, num_data/num_category*cat_smooth_ratio))`. - * The smooth numerator is `b = a * sum_gradient / sum_hessian`. - - -## IO Parameters - -* `max_bin`, default=`255`, type=int - * max number of bin that feature values will bucket in. Small bin may reduce training accuracy but may increase general power (deal with over-fit). - * LightGBM will auto compress memory according `max_bin`. For example, LightGBM will use `uint8_t` for feature value if `max_bin=255`. -* `min_data_in_bin`, default=`5`, type=int - * min number of data inside one bin, use this to avoid one-data-one-bin (may over-fitting). -* `data_random_seed`, default=`1`, type=int - * random seed for data partition in parallel learning(not include feature parallel). -* `output_model`, default=`LightGBM_model.txt`, type=string, alias=`model_output`,`model_out` - * file name of output model in training. -* `input_model`, default=`""`, type=string, alias=`model_input`,`model_in` - * file name of input model. - * for prediction task, will prediction data using this model. - * for train task, will continued train from this model. -* `output_result`, default=`LightGBM_predict_result.txt`, type=string, alias=`predict_result`,`prediction_result` - * file name of prediction result in prediction task. -* `is_pre_partition`, default=`false`, type=bool - * used for parallel learning(not include feature parallel). - * `true` if training data are pre-partitioned, and different machines using different partition. -* `is_sparse`, default=`true`, type=bool, alias=`is_enable_sparse` - * used to enable/disable sparse optimization. Set to `false` to disable sparse optimization. -* `two_round`, default=`false`, type=bool, alias=`two_round_loading`,`use_two_round_loading` - * by default, LightGBM will map data file to memory and load features from memory. This will provide faster data loading speed. But it may out of memory when the data file is very big. - * set this to `true` if data file is too big to fit in memory. -* `save_binary`, default=`false`, type=bool, alias=`is_save_binary`,`is_save_binary_file` - * set this to `true` will save the data set(include validation data) to a binary file. Speed up the data loading speed for the next time. -* `verbosity`, default=`1`, type=int, alias=`verbose` - * `<0` = Fatel, `=0` = Error(Warn), `>0` = Info -* `header`, default=`false`, type=bool, alias=`has_header` - * `true` if input data has header -* `label`, default=`""`, type=string, alias=`label_column` - * specific the label column - * Use number for index, e.g. `label=0` means column_0 is the label - * Add a prefix `name:` for column name, e.g. `label=name:is_click` -* `weight`, default=`""`, type=string, alias=`weight_column` - * specific the weight column - * Use number for index, e.g. `weight=0` means column_0 is the weight - * Add a prefix `name:` for column name, e.g. `weight=name:weight` - * Note: Index start from `0`. And it doesn't count the label column when passing type is Index. e.g. when label is column_0, and weight is column_1, the correct parameter is `weight=0`. -* `query`, default=`""`, type=string, alias=`query_column`,`group`,`group_column` - * specific the query/group id column - * Use number for index, e.g. `query=0` means column_0 is the query id - * Add a prefix `name:` for column name, e.g. `query=name:query_id` - * Note: Data should group by query_id. Index start from `0`. And it doesn't count the label column when passing type is Index. e.g. when label is column_0, and query_id is column_1, the correct parameter is `query=0`. -* `ignore_column`, default=`""`, type=string, alias=`ignore_feature`,`blacklist` - * specific some ignore columns in training - * Use number for index, e.g. `ignore_column=0,1,2` means column_0, column_1 and column_2 will be ignored. - * Add a prefix `name:` for column name, e.g. `ignore_column=name:c1,c2,c3` means c1, c2 and c3 will be ignored. - * Note: Index start from `0`. And it doesn't count the label column. -* `categorical_feature`, default=`""`, type=string, alias=`categorical_column`,`cat_feature`,`cat_column` - * specific categorical features - * Use number for index, e.g. `categorical_feature=0,1,2` means column_0, column_1 and column_2 are categorical features. - * Add a prefix `name:` for column name, e.g. `categorical_feature=name:c1,c2,c3` means c1, c2 and c3 are categorical features. - * Note: Only support categorical with `int` type (Note: the negative values will be treated as Missing values). Index start from `0`. And it doesn't count the label column. -* `predict_raw_score`, default=`false`, type=bool, alias=`raw_score`,`is_predict_raw_score` - * only used in prediction task - * Set to `true` will only predict the raw scores. - * Set to `false` will transformed score -* `predict_leaf_index`, default=`false`, type=bool, alias=`leaf_index`,`is_predict_leaf_index` - * only used in prediction task - * Set to `true` to predict with leaf index of all trees -* `predict_contrib`, default=`false`, type=bool, alias=`contrib`,`is_predict_contrib` - * only used in prediction task - * Set to `true` to estimate [SHAP values](https://arxiv.org/abs/1706.06060), which represent how each feature contributed to each prediction. Produces number of features + 1 values where the last value is the expected value of the model output over the training data. -* `bin_construct_sample_cnt`, default=`200000`, type=int - * Number of data that sampled to construct histogram bins. - * Will give better training result when set this larger. But will increase data loading time. - * Set this to larger value if data is very sparse. -* `num_iteration_predict`, default=`-1`, type=int - * only used in prediction task, used to how many trained iterations will be used in prediction. - * `<= 0` means no limit -* `pred_early_stop`, default=`false`, type=bool - * Set to `true` will use early-stopping to speed up the prediction. May affect the accuracy. -* `pred_early_stop_freq`, default=`10`, type=int - * The frequency of checking early-stopping prediction. -* `pred_early_stop_margin`, default=`10.0`, type=double - * The Threshold of margin in early-stopping prediction. -* `use_missing`, default=`true`, type=bool - * Set to `false` will disable the special handle of missing value. -* `zero_as_missing`, default=`false`, type=bool - * Set to `true` will treat all zero as missing values (including the unshown values in libsvm/sparse matrics). - * Set to `false` will use `na` to represent missing values. -* `init_score_file`, default=`""`, type=string - * Path of training initial score file, `""` will use `train_data_file+".init"` (if exists). -* `valid_init_score_file`, default=`""`, type=multi-string - * Path of validation initial score file, `""` will use `valid_data_file+".init"` (if exists). - * separate by `,` for multi-validation data - - -## Objective Parameters - -* `sigmoid`, default=`1.0`, type=double - * parameter for sigmoid function. Will be used in binary classification and lambdarank. -* `huber_delta`, default=`1.0`, type=double - * parameter for [Huber loss](https://en.wikipedia.org/wiki/Huber_loss "Huber loss - Wikipedia"). Will be used in regression task. -* `fair_c`, default=`1.0`, type=double - * parameter for [Fair loss](https://www.kaggle.com/c/allstate-claims-severity/discussion/24520). Will be used in regression task. -* `gaussian_eta`, default=`1.0`, type=double - * parameter to control the width of Gaussian function. Will be used in l1 and huber regression loss. -* `poission_max_delta_step`, default=`0.7`, type=double - * parameter used to safeguard optimization -* `scale_pos_weight`, default=`1.0`, type=double - * weight of positive class in binary classification task -* `boost_from_average`, default=`true`, type=bool - * adjust initial score to the mean of labels for faster convergence, only used in Regression task. -* `is_unbalance`, default=`false`, type=bool - * used in binary classification. Set this to `true` if training data are unbalance. -* `max_position`, default=`20`, type=int - * used in lambdarank, will optimize NDCG at this position. -* `label_gain`, default=`0,1,3,7,15,31,63,...`, type=multi-double - * used in lambdarank, relevant gain for labels. For example, the gain of label `2` is `3` if using default label gains. - * Separate by `,` -* `num_class`, default=`1`, type=int, alias=`num_classes` - * only used in multi-class classification - - -## Metric Parameters - -* `metric`, default={`l2` for regression}, {`binary_logloss` for binary classification},{`ndcg` for lambdarank}, type=multi-enum, options=`l1`,`l2`,`ndcg`,`auc`,`binary_logloss`,`binary_error`... - * `l1`, absolute loss, alias=`mean_absolute_error`, `mae` - * `l2`, square loss, alias=`mean_squared_error`, `mse` - * `l2_root`, root square loss, alias=`root_mean_squared_error`, `rmse` - * `huber`, [Huber loss](https://en.wikipedia.org/wiki/Huber_loss "Huber loss - Wikipedia") - * `fair`, [Fair loss](https://www.kaggle.com/c/allstate-claims-severity/discussion/24520) - * `poisson`, [Poisson regression](https://en.wikipedia.org/wiki/Poisson_regression "Poisson regression") - * `ndcg`, [NDCG](https://en.wikipedia.org/wiki/Discounted_cumulative_gain#Normalized_DCG) - * `map`, [MAP](https://en.wikipedia.org/wiki/Information_retrieval#Mean_average_precision) - * `auc`, [AUC](https://en.wikipedia.org/wiki/Receiver_operating_characteristic#Area_under_the_curve) - * `binary_logloss`, [log loss](https://www.kaggle.com/wiki/LogLoss) - * `binary_error`. For one sample `0` for correct classification, `1` for error classification. - * `multi_logloss`, log loss for mulit-class classification - * `multi_error`. error rate for mulit-class classification - * Support multi metrics, separate by `,` -* `metric_freq`, default=`1`, type=int - * frequency for metric output -* `is_training_metric`, default=`false`, type=bool - * set this to true if need to output metric result of training -* `ndcg_at`, default=`1,2,3,4,5`, type=multi-int, alias=`ndcg_eval_at`,`eval_at` - * NDCG evaluation position, separate by `,` - - -## Network Parameters - -Following parameters are used for parallel learning, and only used for base(socket) version. - -* `num_machines`, default=`1`, type=int, alias=`num_machine` - * Used for parallel learning, the number of machines for parallel learning application - * Need to set this in both socket and mpi version. -* `local_listen_port`, default=`12400`, type=int, alias=`local_port` - * TCP listen port for local machines. - * Should allow this port in firewall setting before training. -* `time_out`, default=`120`, type=int - * Socket time-out in minutes. -* `machine_list_file`, default=`""`, type=string - * File that list machines for this parallel learning application - * Each line contains one IP and one port for one machine. The format is `ip port`, separate by space. - - -## GPU Parameters - -* `gpu_platform_id`, default=`-1`, type=int - * OpenCL platform ID. Usually each GPU vendor exposes one OpenCL platform. - * Default value is -1, using the system-wide default platform. -* `gpu_device_id`, default=`-1`, type=int - * OpenCL device ID in the specified platform. Each GPU in the selected platform has a unique device ID. - * Default value is -1, using the default device in the selected platform. -* `gpu_use_dp`, default=`false`, type=bool - * Set to true to use double precision math on GPU (default using single precision). - - -## Convert Model Parameters - -This feature is only supported in command line version yet. - -* `convert_model_language`, default=`""`, type=string - * only `cpp` is supported yet. - * if `convert_model_language` is set when `task` is set to `train`, the model will also be converted. - -* `convert_model`, default=`"gbdt_prediction.cpp"`, type=string - * output file name of converted model. - -## Others - -### Continued Training with Input Score - -LightGBM support continued train with initial score. It uses an additional file to store these initial score, like the following: - -``` -0.5 --0.1 -0.9 -... -``` - -It means the initial score of first data is `0.5`, second is `-0.1`, and so on. The initial score file corresponds with data file line by line, and has per score per line. And if the name of data file is "train.txt", the initial score file should be named as "train.txt.init" and in the same folder as the data file. And LightGBM will auto load initial score file if it exists. - - -### Weight Data - -LightGBM support weighted training. It uses an additional file to store weight data, like the following: - -``` -1.0 -0.5 -0.8 -... -``` - -It means the weight of first data is `1.0`, second is `0.5`, and so on. The weight file corresponds with data file line by line, and has per weight per line. And if the name of data file is "train.txt", the weight file should be named as "train.txt.weight" and in the same folder as the data file. And LightGBM will auto load weight file if it exists. - -update: -You can specific weight column in data file now. Please refer to parameter `weight` in above. - - -### Query Data - -For LambdaRank learning, it needs query information for training data. LightGBM use an additional file to store query data. Following is an example: - -``` -27 -18 -67 -... -``` - -It means first `27` lines samples belong one query and next `18` lines belong to another, and so on.(**Note: data should order by query**) If name of data file is "train.txt", the query file should be named as "train.txt.query" and in same folder of training data. LightGBM will load the query file automatically if it exists. - -You can specific query/group id in data file now. Please refer to parameter `group` in above. diff --git a/docs/Parameters.rst b/docs/Parameters.rst new file mode 100644 index 000000000..296a6a42e --- /dev/null +++ b/docs/Parameters.rst @@ -0,0 +1,730 @@ +Parameters +========== + +This page contains all parameters in LightGBM. + +**List of other helpful links** + +- `Python API <./Python-API.rst>`__ + +- `Parameters Tuning <./Parameters-Tuning.rst>`__ + +**External Links** + +- `Laurae++ Interactive Documentation`_ + +**Update of 08/04/2017** + +Default values for the following parameters have changed: + +- ``min_data_in_leaf`` = 100 => 20 +- ``min_sum_hessian_in_leaf`` = 10 => 1e-3 +- ``num_leaves`` = 127 => 31 +- ``num_iterations`` = 10 => 100 + +Parameters Format +----------------- + +The parameters format is ``key1=value1 key2=value2 ...``. +And parameters can be set both in config file and command line. +By using command line, parameters should not have spaces before and after ``=``. +By using config files, one line can only contain one parameter. You can use ``#`` to comment. + +If one parameter appears in both command line and config file, LightGBM will use the parameter in command line. + +Core Parameters +--------------- + +- ``config``, default=\ ``""``, type=string, alias=\ ``config_file`` + + - path of config file + +- ``task``, default=\ ``train``, type=enum, options=\ ``train``, ``prediction`` + + - ``train`` for training + + - ``prediction`` for prediction. + + - ``convert_model`` for converting model file into if-else format, see more information in `Convert model parameters <#convert-model-parameters>`__ + +- ``application``, default=\ ``regression``, type=enum, + options=\ ``regression``, ``regression_l2``, ``regression_l1``, ``huber``, ``fair``, ``poisson``, ``binary``, ``lambdarank``, ``multiclass``, + alias=\ ``objective``, ``app`` + + - ``regression``, regression application + + - ``regression_l2``, L2 loss, alias=\ ``mean_squared_error``, ``mse`` + + - ``regression_l1``, L1 loss, alias=\ ``mean_absolute_error``, ``mae`` + + - ``huber``, `Huber loss`_ + + - ``fair``, `Fair loss`_ + + - ``poisson``, `Poisson regression`_ + + - ``binary``, binary classification application + + - ``lambdarank``, `lambdarank`_ application + + - the label should be ``int`` type in lambdarank tasks, and larger number represent the higher relevance (e.g. 0:bad, 1:fair, 2:good, 3:perfect) + + - ``label_gain`` can be used to set the gain(weight) of ``int`` label + + - ``multiclass``, multi-class classification application, ``num_class`` should be set as well + +- ``boosting``, default=\ ``gbdt``, type=enum, + options=\ ``gbdt``, ``rf``, ``dart``, ``goss``, + alias=\ ``boost``, ``boosting_type`` + + - ``gbdt``, traditional Gradient Boosting Decision Tree + + - ``rf``, Random Forest + + - ``dart``, `Dropouts meet Multiple Additive Regression Trees`_ + + - ``goss``, Gradient-based One-Side Sampling + +- ``data``, default=\ ``""``, type=string, alias=\ ``train``, ``train_data`` + + - training data, LightGBM will train from this data + +- ``valid``, default=\ ``""``, type=multi-string, alias=\ ``test``, ``valid_data``, ``test_data`` + + - validation/test data, LightGBM will output metrics for these data + + - support multi validation data, separate by ``,`` + +- ``num_iterations``, default=\ ``100``, type=int, + alias=\ ``num_iteration``, ``num_tree``, ``num_trees``, ``num_round``, ``num_rounds`` + + - number of boosting iterations + - **Note**: for Python/R package, **this parameter is ignored**, + use ``num_boost_round`` (Python) or ``nrounds`` (R) input arguments of ``train`` and ``cv`` methods instead + + - **Note**: internally, LightGBM constructs ``num_class * num_iterations`` trees for ``multiclass`` problems + +- ``learning_rate``, default=\ ``0.1``, type=double, alias=\ ``shrinkage_rate`` + + - shrinkage rate + + - in ``dart``, it also affects on normalization weights of dropped trees + +- ``num_leaves``, default=\ ``31``, type=int, alias=\ ``num_leaf`` + + - number of leaves in one tree + +- ``tree_learner``, default=\ ``serial``, type=enum, options=\ ``serial``, ``feature``, ``data`` + + - ``serial``, single machine tree learner + + - ``feature``, feature parallel tree learner + + - ``data``, data parallel tree learner + + - refer to `Parallel Learning Guide <./Parallel-Learning-Guide.rst>`__ to get more details + +- ``num_threads``, default=\ ``OpenMP_default``, type=int, alias=\ ``num_thread``, ``nthread`` + + - number of threads for LightGBM + + - for the best speed, set this to the number of **real CPU cores**, + not the number of threads (most CPU using `hyper-threading`_ to generate 2 threads per CPU core) + + - do not set it too large if your dataset is small (do not use 64 threads for a dataset with 10,000 rows for instance) + + - be aware a task manager or any similar CPU monitoring tool might report cores not being fully utilized. **This is normal** + + - for parallel learning, should not use full CPU cores since this will cause poor performance for the network + +- ``device``, default=\ ``cpu``, options=\ ``cpu``, ``gpu`` + + - choose device for the tree learning, you can use GPU to achieve the faster learning + + - **Note**: it is recommended to use the smaller ``max_bin`` (e.g. 63) to get the better speed up + + - **Note**: for the faster speed, GPU use 32-bit float point to sum up by default, may affect the accuracy for some tasks. + You can set ``gpu_use_dp=true`` to enable 64-bit float point, but it will slow down the training + + - **Note**: refer to `Installation Guide <./Installation-Guide.rst#build-gpu-version>`__ to build with GPU + +Learning Control Parameters +--------------------------- + +- ``max_depth``, default=\ ``-1``, type=int + + - limit the max depth for tree model. This is used to deal with over-fitting when ``#data`` is small. Tree still grows by leaf-wise + + - ``< 0`` means no limit + +- ``min_data_in_leaf``, default=\ ``20``, type=int, alias=\ ``min_data_per_leaf`` , ``min_data`` + + - minimal number of data in one leaf. Can be used to deal with over-fitting + +- ``min_sum_hessian_in_leaf``, default=\ ``1e-3``, type=double, + alias=\ ``min_sum_hessian_per_leaf``, ``min_sum_hessian``, ``min_hessian`` + + - minimal sum hessian in one leaf. Like ``min_data_in_leaf``, it can be used to deal with over-fitting + +- ``feature_fraction``, default=\ ``1.0``, type=double, ``0.0 < feature_fraction < 1.0``, alias=\ ``sub_feature`` + + - LightGBM will randomly select part of features on each iteration if ``feature_fraction`` smaller than ``1.0``. + For example, if set to ``0.8``, will select 80% features before training each tree + + - can be used to speed up training + + - can be used to deal with over-fitting + +- ``feature_fraction_seed``, default=\ ``2``, type=int + + - random seed for ``feature_fraction`` + +- ``bagging_fraction``, default=\ ``1.0``, type=double, ``0.0 < bagging_fraction < 1.0``, alias=\ ``sub_row`` + + - like ``feature_fraction``, but this will randomly select part of data without resampling + + - can be used to speed up training + + - can be used to deal with over-fitting + + - **Note**: To enable bagging, ``bagging_freq`` should be set to a non zero value as well + +- ``bagging_freq``, default=\ ``0``, type=int + + - frequency for bagging, ``0`` means disable bagging. ``k`` means will perform bagging at every ``k`` iteration + + - **Note**: to enable bagging, ``bagging_fraction`` should be set as well + +- ``bagging_seed`` , default=\ ``3``, type=int + + - random seed for bagging + +- ``early_stopping_round``, default=\ ``0``, type=int, alias=\ ``early_stopping_rounds``, ``early_stopping`` + + - will stop training if one metric of one validation data doesn't improve in last ``early_stopping_round`` rounds + +- ``lambda_l1``, default=\ ``0``, type=double + + - L1 regularization + +- ``lambda_l2``, default=\ ``0``, type=double + + - L2 regularization + +- ``min_gain_to_split``, default=\ ``0``, type=double + + - the minimal gain to perform split + +- ``drop_rate``, default=\ ``0.1``, type=double + + - only used in ``dart`` + +- ``skip_drop``, default=\ ``0.5``, type=double + + - only used in ``dart``, probability of skipping drop + +- ``max_drop``, default=\ ``50``, type=int + + - only used in ``dart``, max number of dropped trees on one iteration + + - ``<=0`` means no limit + +- ``uniform_drop``, default=\ ``false``, type=bool + + - only used in ``dart``, set this to ``true`` if want to use uniform drop + +- ``xgboost_dart_mode``, default=\ ``false``, type=bool + + - only used in ``dart``, set this to ``true`` if want to use xgboost dart mode + +- ``drop_seed``, default=\ ``4``, type=int + + - only used in ``dart``, random seed to choose dropping models + +- ``top_rate``, default=\ ``0.2``, type=double + + - only used in ``goss``, the retain ratio of large gradient data + +- ``other_rate``, default=\ ``0.1``, type=int + + - only used in ``goss``, the retain ratio of small gradient data + +- ``max_cat_group``, default=\ ``64``, type=int + + - use for the categorical features + + - when ``#catogory`` is large, finding the split point on it is easily over-fitting. + So LightGBM merges them into ``max_cat_group`` groups, and finds the split points on the group boundaries + +- ``min_data_per_group``, default=\ ``10``, type=int + + - min number of data per categorical group + +- ``max_cat_threshold``, default=\ ``256``, type=int + + - use for the categorical features + + - limit the max threshold points in categorical features + +- ``min_cat_smooth``, default=\ ``5``, type=double + + - use for the categorical features + + - refer to the descrption of the paramater ``cat_smooth_ratio`` + +- ``max_cat_smooth``, default=\ ``100``, type=double + + - use for the categorical features + + - refer to the descrption of the paramater ``cat_smooth_ratio`` + +- ``cat_smooth_ratio``, default=\ ``0.01``, type=double + + - use for the categorical features + + - this can reduce the effect of noises in categorical features, especially for categories with few data + + - the smooth denominator is ``a = min(max_cat_smooth, max(min_cat_smooth, num_data / num_category * cat_smooth_ratio))`` + + - the smooth numerator is ``b = a * sum_gradient / sum_hessian`` + +IO Parameters +------------- + +- ``max_bin``, default=\ ``255``, type=int + + - max number of bins that feature values will be bucketed in. + Small number of bins may reduce training accuracy but may increase general power (deal with over-fitting) + + - LightGBM will auto compress memory according ``max_bin``. + For example, LightGBM will use ``uint8_t`` for feature value if ``max_bin=255`` + +- ``min_data_in_bin``, default=\ ``5``, type=int + + - min number of data inside one bin, use this to avoid one-data-one-bin (may over-fitting) + +- ``data_random_seed``, default=\ ``1``, type=int + + - random seed for data partition in parallel learning (not include feature parallel) + +- ``output_model``, default=\ ``LightGBM_model.txt``, type=string, alias=\ ``model_output``, ``model_out`` + + - file name of output model in training + +- ``input_model``, default=\ ``""``, type=string, alias=\ ``model_input``, ``model_in`` + + - file name of input model + + - for ``prediction`` task, this model will be used for prediction data + + - for ``train`` task, training will be continued from this model + +- ``output_result``, default=\ ``LightGBM_predict_result.txt``, + type=string, alias=\ ``predict_result``, ``prediction_result`` + + - file name of prediction result in ``prediction`` task + +- ``is_pre_partition``, default=\ ``false``, type=bool + + - used for parallel learning (not include feature parallel) + + - ``true`` if training data are pre-partitioned, and different machines use different partitions + +- ``is_sparse``, default=\ ``true``, type=bool, alias=\ ``is_enable_sparse`` + + - used to enable/disable sparse optimization. Set to ``false`` to disable sparse optimization + +- ``two_round``, default=\ ``false``, type=bool, alias=\ ``two_round_loading``, ``use_two_round_loading`` + + - by default, LightGBM will map data file to memory and load features from memory. + This will provide faster data loading speed. But it may run out of memory when the data file is very big + + - set this to ``true`` if data file is too big to fit in memory + +- ``save_binary``, default=\ ``false``, type=bool, alias=\ ``is_save_binary``, ``is_save_binary_file`` + + - if ``true`` LightGBM will save the dataset (include validation data) to a binary file. + Speed up the data loading for the next time + +- ``verbosity``, default=\ ``1``, type=int, alias=\ ``verbose`` + + - ``<0`` = Fatal, + ``=0`` = Error (Warn), + ``>0`` = Info + +- ``header``, default=\ ``false``, type=bool, alias=\ ``has_header`` + + - set this to ``true`` if input data has header + +- ``label``, default=\ ``""``, type=string, alias=\ ``label_column`` + + - specify the label column + + - use number for index, e.g. ``label=0`` means column\_0 is the label + + - add a prefix ``name:`` for column name, e.g. ``label=name:is_click`` + +- ``weight``, default=\ ``""``, type=string, alias=\ ``weight_column`` + + - specify the weight column + + - use number for index, e.g. ``weight=0`` means column\_0 is the weight + + - add a prefix ``name:`` for column name, e.g. ``weight=name:weight`` + + - **Note**: index starts from ``0``. + And it doesn't count the label column when passing type is Index, e.g. when label is column\_0, and weight is column\_1, the correct parameter is ``weight=0`` + +- ``query``, default=\ ``""``, type=string, alias=\ ``query_column``, ``group``, ``group_column`` + + - specify the query/group id column + + - use number for index, e.g. ``query=0`` means column\_0 is the query id + + - add a prefix ``name:`` for column name, e.g. ``query=name:query_id`` + + - **Note**: data should be grouped by query\_id. + Index starts from ``0``. + And it doesn't count the label column when passing type is Index, e.g. when label is column\_0 and query\_id is column\_1, the correct parameter is ``query=0`` + +- ``ignore_column``, default=\ ``""``, type=string, alias=\ ``ignore_feature``, ``blacklist`` + + - specify some ignoring columns in training + + - use number for index, e.g. ``ignore_column=0,1,2`` means column\_0, column\_1 and column\_2 will be ignored + + - add a prefix ``name:`` for column name, e.g. ``ignore_column=name:c1,c2,c3`` means c1, c2 and c3 will be ignored + + - **Note**: index starts from ``0``. And it doesn't count the label column + +- ``categorical_feature``, default=\ ``""``, type=string, alias=\ ``categorical_column``, ``cat_feature``, ``cat_column`` + + - specify categorical features + + - use number for index, e.g. ``categorical_feature=0,1,2`` means column\_0, column\_1 and column\_2 are categorical features + + - add a prefix ``name:`` for column name, e.g. ``categorical_feature=name:c1,c2,c3`` means c1, c2 and c3 are categorical features + + - **Note**: only supports categorical with ``int`` type. Index starts from ``0``. And it doesn't count the label column + + - **Note**: the negative values will be treated as **missing values** + +- ``predict_raw_score``, default=\ ``false``, type=bool, alias=\ ``raw_score``, ``is_predict_raw_score`` + + - only used in ``prediction`` task + + - set to ``true`` to predict only the raw scores + + - set to ``false`` to predict transformed scores + +- ``predict_leaf_index``, default=\ ``false``, type=bool, alias=\ ``leaf_index``, ``is_predict_leaf_index`` + + - only used in ``prediction`` task + + - set to ``true`` to predict with leaf index of all trees + +- ``predict_contrib``, default=\ ``false``, type=bool, alias=\ ``contrib``, ``is_predict_contrib`` + + - only used in ``prediction`` task + + - set to ``true`` to estimate `SHAP values`_, which represent how each feature contributs to each prediction. + Produces number of features + 1 values where the last value is the expected value of the model output over the training data + +- ``bin_construct_sample_cnt``, default=\ ``200000``, type=int + + - number of data that sampled to construct histogram bins + + - will give better training result when set this larger, but will increase data loading time + + - set this to larger value if data is very sparse + +- ``num_iteration_predict``, default=\ ``-1``, type=int + + - only used in ``prediction`` task + - use to specify how many trained iterations will be used in prediction + + - ``<= 0`` means no limit + +- ``pred_early_stop``, default=\ ``false``, type=bool + + - if ``true`` will use early-stopping to speed up the prediction. May affect the accuracy + +- ``pred_early_stop_freq``, default=\ ``10``, type=int + + - the frequency of checking early-stopping prediction + +- ``pred_early_stop_margin``, default=\ ``10.0``, type=double + + - the threshold of margin in early-stopping prediction + +- ``use_missing``, default=\ ``true``, type=bool + + - set to ``false`` to disable the special handle of missing value + +- ``zero_as_missing``, default=\ ``false``, type=bool + + - set to ``true`` to treat all zero as missing values (including the unshown values in libsvm/sparse matrics) + + - set to ``false`` to use ``na`` to represent missing values + +- ``init_score_file``, default=\ ``""``, type=string + + - path to training initial score file, ``""`` will use ``train_data_file`` + ``.init`` (if exists) + +- ``valid_init_score_file``, default=\ ``""``, type=multi-string + + - path to validation initial score file, ``""`` will use ``valid_data_file`` + ``.init`` (if exists) + + - separate by ``,`` for multi-validation data + +Objective Parameters +-------------------- + +- ``sigmoid``, default=\ ``1.0``, type=double + + - parameter for sigmoid function. Will be used in ``binary`` classification and ``lambdarank`` + +- ``huber_delta``, default=\ ``1.0``, type=double + + - parameter for `Huber loss`_. Will be used in ``regression`` task + +- ``fair_c``, default=\ ``1.0``, type=double + + - parameter for `Fair loss`_. Will be used in ``regression`` task + +- ``gaussian_eta``, default=\ ``1.0``, type=double + + - parameter to control the width of Gaussian function. Will be used in ``regression_l1`` and ``huber`` losses + +- ``poission_max_delta_step``, default=\ ``0.7``, type=double + + - parameter used to safeguard optimization + +- ``scale_pos_weight``, default=\ ``1.0``, type=double + + - weight of positive class in ``binary`` classification task + +- ``boost_from_average``, default=\ ``true``, type=bool + + - only used in ``regression`` task + + - adjust initial score to the mean of labels for faster convergence + +- ``is_unbalance``, default=\ ``false``, type=bool + + - used in ``binary`` classification + + - set this to ``true`` if training data are unbalance + +- ``max_position``, default=\ ``20``, type=int + + - used in ``lambdarank`` + + - will optimize `NDCG`_ at this position + +- ``label_gain``, default=\ ``0,1,3,7,15,31,63,...``, type=multi-double + + - used in ``lambdarank`` + + - relevant gain for labels. For example, the gain of label ``2`` is ``3`` if using default label gains + + - separate by ``,`` + +- ``num_class``, default=\ ``1``, type=int, alias=\ ``num_classes`` + + - only used in ``multiclass`` classification + +Metric Parameters +----------------- + +- ``metric``, default={``l2`` for regression}, {``binary_logloss`` for binary classification}, {``ndcg`` for lambdarank}, type=multi-enum, + options=\ ``l1``, ``l2``, ``ndcg``, ``auc``, ``binary_logloss``, ``binary_error`` ... + + - ``l1``, absolute loss, alias=\ ``mean_absolute_error``, ``mae`` + + - ``l2``, square loss, alias=\ ``mean_squared_error``, ``mse`` + + - ``l2_root``, root square loss, alias=\ ``root_mean_squared_error``, ``rmse`` + + - ``huber``, `Huber loss`_ + + - ``fair``, `Fair loss`_ + + - ``poisson``, `Poisson regression`_ + + - ``ndcg``, `NDCG`_ + + - ``map``, `MAP`_ + + - ``auc``, `AUC`_ + + - ``binary_logloss``, `log loss`_ + + - ``binary_error``. + For one sample: ``0`` for correct classification, ``1`` for error classification + + - ``multi_logloss``, log loss for mulit-class classification + + - ``multi_error``, error rate for mulit-class classification + + - support multi metrics, separated by ``,`` + +- ``metric_freq``, default=\ ``1``, type=int + + - frequency for metric output + +- ``is_training_metric``, default=\ ``false``, type=bool + + - set this to ``true`` if you need to output metric result of training + +- ``ndcg_at``, default=\ ``1,2,3,4,5``, type=multi-int, alias=\ ``ndcg_eval_at``, ``eval_at`` + + - `NDCG`_ evaluation positions, separated by ``,`` + +Network Parameters +------------------ + +Following parameters are used for parallel learning, and only used for base (socket) version. + +- ``num_machines``, default=\ ``1``, type=int, alias=\ ``num_machine`` + + - used for parallel learning, the number of machines for parallel learning application + + - need to set this in both socket and mpi versions + +- ``local_listen_port``, default=\ ``12400``, type=int, alias=\ ``local_port`` + + - TCP listen port for local machines + + - you should allow this port in firewall settings before training + +- ``time_out``, default=\ ``120``, type=int + + - socket time-out in minutes + +- ``machine_list_file``, default=\ ``""``, type=string + + - file that lists machines for this parallel learning application + + - each line contains one IP and one port for one machine. The format is ``ip port``, separate by space + +GPU Parameters +-------------- + +- ``gpu_platform_id``, default=\ ``-1``, type=int + + - OpenCL platform ID. Usually each GPU vendor exposes one OpenCL platform. + + - default value is ``-1``, means the system-wide default platform + +- ``gpu_device_id``, default=\ ``-1``, type=int + + - OpenCL device ID in the specified platform. Each GPU in the selected platform has a unique device ID + + - default value is ``-1``, means the default device in the selected platform + +- ``gpu_use_dp``, default=\ ``false``, type=bool + + - set to ``true`` to use double precision math on GPU (default using single precision) + +Convert Model Parameters +------------------------ + +This feature is only supported in command line version yet. + +- ``convert_model_language``, default=\ ``""``, type=string + + - only ``cpp`` is supported yet + + - if ``convert_model_language`` is set when ``task`` is set to ``train``, the model will also be converted + +- ``convert_model``, default=\ ``"gbdt_prediction.cpp"``, type=string + + - output file name of converted model + +Others +------ + +Continued Training with Input Score +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +LightGBM supports continued training with initial scores. It uses an additional file to store these initial scores, like the following: + +:: + + 0.5 + -0.1 + 0.9 + ... + +It means the initial score of the first data row is ``0.5``, second is ``-0.1``, and so on. +The initial score file corresponds with data file line by line, and has per score per line. +And if the name of data file is ``train.txt``, the initial score file should be named as ``train.txt.init`` and in the same folder as the data file. +In this case LightGBM will auto load initial score file if it exists. + +Weight Data +~~~~~~~~~~~ + +LightGBM supporta weighted training. It uses an additional file to store weight data, like the following: + +:: + + 1.0 + 0.5 + 0.8 + ... + +It means the weight of the first data row is ``1.0``, second is ``0.5``, and so on. +The weight file corresponds with data file line by line, and has per weight per line. +And if the name of data file is ``train.txt``, the weight file should be named as ``train.txt.weight`` and in the same folder as the data file. +In this case LightGBM will auto load weight file if it exists. + +**update**: +You can specific weight column in data file now. Please refer to parameter ``weight`` in above. + +Query Data +~~~~~~~~~~ + +For LambdaRank learning, it needs query information for training data. +LightGBM use an additional file to store query data, like the following: + +:: + + 27 + 18 + 67 + ... + +It means first ``27`` lines samples belong one query and next ``18`` lines belong to another, and so on. + +**Note**: data should be ordered by the query. + +If the name of data file is ``train.txt``, the query file should be named as ``train.txt.query`` and in same folder of training data. +In this case LightGBM will load the query file automatically if it exists. + +**update**: +You can specific query/group id in data file now. Please refer to parameter ``group`` in above. + +.. _Laurae++ Interactive Documentation: https://sites.google.com/view/lauraepp/parameters + +.. _Huber loss: https://en.wikipedia.org/wiki/Huber_loss + +.. _Fair loss: https://www.kaggle.com/c/allstate-claims-severity/discussion/24520 + +.. _Poisson regression: https://en.wikipedia.org/wiki/Poisson_regression + +.. _lambdarank: https://papers.nips.cc/paper/2971-learning-to-rank-with-nonsmooth-cost-functions.pdf + +.. _Dropouts meet Multiple Additive Regression Trees: https://arxiv.org/abs/1505.01866 + +.. _hyper-threading: https://en.wikipedia.org/wiki/Hyper-threading + +.. _SHAP values: https://arxiv.org/abs/1706.06060 + +.. _NDCG: https://en.wikipedia.org/wiki/Discounted_cumulative_gain#Normalized_DCG + +.. _MAP: https://en.wikipedia.org/wiki/Information_retrieval#Mean_average_precision + +.. _AUC: https://en.wikipedia.org/wiki/Receiver_operating_characteristic#Area_under_the_curve + +.. _log loss: https://www.kaggle.com/wiki/LogLoss diff --git a/docs/Python-Intro.rst b/docs/Python-Intro.rst new file mode 100644 index 000000000..693dab44e --- /dev/null +++ b/docs/Python-Intro.rst @@ -0,0 +1,222 @@ +Python Package Introduction +=========================== + +This document gives a basic walkthrough of LightGBM Python-package. + +**List of other helpful links** + +- `Python Examples `__ + +- `Python API <./Python-API.rst>`__ + +- `Parameters Tuning <./Parameters-Tuning.rst>`__ + +Install +------- + +Install Python-package dependencies, +``setuptools``, ``wheel``, ``numpy`` and ``scipy`` are required, ``scikit-learn`` is required for sklearn interface and recommended: + +:: + + pip install setuptools wheel numpy scipy scikit-learn -U + +Refer to `Python-package`_ folder for the installation guide. + +To verify your installation, try to ``import lightgbm`` in Python: + +:: + + import lightgbm as lgb + +Data Interface +-------------- + +The LightGBM Python module is able to load data from: + +- libsvm/tsv/csv txt format file + +- Numpy 2D array, pandas object + +- LightGBM binary file + +The data is stored in a ``Dataset`` object. + +**To load a libsvm text file or a LightGBM binary file into Dataset:** + +.. code:: python + + train_data = lgb.Dataset('train.svm.bin') + +**To load a numpy array into Dataset:** + +.. code:: python + + data = np.random.rand(500, 10) # 500 entities, each contains 10 features + label = np.random.randint(2, size=500) # binary target + train_data = lgb.Dataset(data, label=label) + +**To load a scpiy.sparse.csr\_matrix array into Dataset:** + +.. code:: python + + csr = scipy.sparse.csr_matrix((dat, (row, col))) + train_data = lgb.Dataset(csr) + +**Saving Dataset into a LightGBM binary file will make loading faster:** + +.. code:: python + + train_data = lgb.Dataset('train.svm.txt') + train_data.save_binary('train.bin') + +**Create validation data:** + +.. code:: python + + test_data = train_data.create_valid('test.svm') + +or + +.. code:: python + + test_data = lgb.Dataset('test.svm', reference=train_data) + +In LightGBM, the validation data should be aligned with training data. + +**Specific feature names and categorical features:** + +.. code:: python + + train_data = lgb.Dataset(data, label=label, feature_name=['c1', 'c2', 'c3'], categorical_feature=['c3']) + +LightGBM can use categorical features as input directly. +It doesn't need to covert to one-hot coding, and is much faster than one-hot coding (about 8x speed-up). + +**Note**: You should convert your categorical features to ``int`` type before you construct ``Dataset``. + +**Weights can be set when needed:** + +.. code:: python + + w = np.random.rand(500, ) + train_data = lgb.Dataset(data, label=label, weight=w) + +or + +.. code:: python + + train_data = lgb.Dataset(data, label=label) + w = np.random.rand(500, ) + train_data.set_weight(w) + +And you can use ``Dataset.set_init_score()`` to set initial score, and ``Dataset.set_group()`` to set group/query data for ranking tasks. + +**Memory efficent usage:** + +The ``Dataset`` object in LightGBM is very memory-efficient, due to it only need to save discrete bins. +However, Numpy/Array/Pandas object is memory cost. +If you concern about your memory consumption. You can save memory accroding to following: + +1. Let ``free_raw_data=True`` (default is ``True``) when constructing the ``Dataset`` + +2. Explicit set ``raw_data=None`` after the ``Dataset`` has been constructed + +3. Call ``gc`` + +Setting Parameters +------------------ + +LightGBM can use either a list of pairs or a dictionary to set `Parameters <./Parameters.rst>`__. +For instance: + +- Booster parameters: + + .. code:: python + + param = {'num_leaves':31, 'num_trees':100, 'objective':'binary'} + param['metric'] = 'auc' + +- You can also specify multiple eval metrics: + + .. code:: python + + param['metric'] = ['auc', 'binary_logloss'] + +Training +-------- + +Training a model requires a parameter list and data set: + +.. code:: python + + num_round = 10 + bst = lgb.train(param, train_data, num_round, valid_sets=[test_data]) + +After training, the model can be saved: + +.. code:: python + + bst.save_model('model.txt') + +The trained model can also be dumped to JSON format: + +.. code:: python + + json_model = bst.dump_model() + +A saved model can be loaded. + +.. code:: python + + bst = lgb.Booster(model_file='model.txt') #init model + +CV +-- + +Training with 5-fold CV: + +.. code:: python + + num_round = 10 + lgb.cv(param, train_data, num_round, nfold=5) + +Early Stopping +-------------- + +If you have a validation set, you can use early stopping to find the optimal number of boosting rounds. +Early stopping requires at least one set in ``valid_sets``. If there is more than one, it will use all of them: + +.. code:: python + + bst = lgb.train(param, train_data, num_round, valid_sets=valid_sets, early_stopping_rounds=10) + bst.save_model('model.txt', num_iteration=bst.best_iteration) + +The model will train until the validation score stops improving. +Validation error needs to improve at least every ``early_stopping_rounds`` to continue training. + +If early stopping occurs, the model will have an additional field: ``bst.best_iteration``. +Note that ``train()`` will return a model from the last iteration, not the best one. +And you can set ``num_iteration=bst.best_iteration`` when saving model. + +This works with both metrics to minimize (L2, log loss, etc.) and to maximize (NDCG, AUC). +Note that if you specify more than one evaluation metric, all of them will be used for early stopping. + +Prediction +---------- + +A model that has been trained or loaded can perform predictions on data sets: + +.. code:: python + + # 7 entities, each contains 10 features + data = np.random.rand(7, 10) + ypred = bst.predict(data) + +If early stopping is enabled during training, you can get predictions from the best iteration with ``bst.best_iteration``: + +.. code:: python + + ypred = bst.predict(data, num_iteration=bst.best_iteration) + +.. _Python-package: https://github.com/Microsoft/LightGBM/tree/master/python-package diff --git a/docs/Python-intro.md b/docs/Python-intro.md deleted file mode 100644 index 6e3671fa9..000000000 --- a/docs/Python-intro.md +++ /dev/null @@ -1,206 +0,0 @@ -Python Package Introduction -=========================== - -This document gives a basic walkthrough of LightGBM Python-package. - -***List of other Helpful Links*** -* [Python Examples](https://github.com/Microsoft/LightGBM/tree/master/examples/python-guide) -* [Python API](./Python-API.rst) -* [Parameters Tuning](./Parameters-tuning.md) - -Install -------- - -Install Python-package dependencies, `setuptools`, `wheel`, `numpy` and `scipy` are required, `scikit-learn` is required for sklearn interface and recommended: - -``` -pip install setuptools wheel numpy scipy scikit-learn -U -``` - -Refer to [Python-package](https://github.com/Microsoft/LightGBM/tree/master/python-package) folder for the installation guide. - -To verify your installation, try to `import lightgbm` in Python: - -``` -import lightgbm as lgb -``` - -Data Interface --------------- - -The LightGBM Python module is able to load data from: - -- libsvm/tsv/csv txt format file -- Numpy 2D array, pandas object -- LightGBM binary file - -The data is stored in a ```Dataset``` object. - -#### To load a libsvm text file or a LightGBM binary file into ```Dataset```: - -```python -train_data = lgb.Dataset('train.svm.bin') -``` - -#### To load a numpy array into ```Dataset```: - -```python -data = np.random.rand(500, 10) # 500 entities, each contains 10 features -label = np.random.randint(2, size=500) # binary target -train_data = lgb.Dataset(data, label=label) -``` - -#### To load a scpiy.sparse.csr_matrix array into ```Dataset```: - -```python -csr = scipy.sparse.csr_matrix((dat, (row, col))) -train_data = lgb.Dataset(csr) -``` - -#### Saving ```Dataset``` into a LightGBM binary file will make loading faster: - -```python -train_data = lgb.Dataset('train.svm.txt') -train_data.save_binary('train.bin') -``` - -#### Create validation data: - -```python -test_data = train_data.create_valid('test.svm') -``` - -or - -```python -test_data = lgb.Dataset('test.svm', reference=train_data) -``` - -In LightGBM, the validation data should be aligned with training data. - -#### Specific feature names and categorical features: - -```python -train_data = lgb.Dataset(data, label=label, feature_name=['c1', 'c2', 'c3'], categorical_feature=['c3']) -``` - -LightGBM can use categorical features as input directly. It doesn't need to covert to one-hot coding, and is much faster than one-hot coding (about 8x speed-up). - -**Note**:You should convert your categorical features to int type before you construct `Dataset`. - -#### Weights can be set when needed: - -```python -w = np.random.rand(500, ) -train_data = lgb.Dataset(data, label=label, weight=w) -``` - -or - -```python -train_data = lgb.Dataset(data, label=label) -w = np.random.rand(500, ) -train_data.set_weight(w) -``` - -And you can use `Dataset.set_init_score()` to set initial score, and `Dataset.set_group()` to set group/query data for ranking tasks. - -#### Memory efficent usage - -The `Dataset` object in LightGBM is very memory-efficient, due to it only need to save discrete bins. -However, Numpy/Array/Pandas object is memory cost. If you concern about your memory consumption. You can save memory accroding to following: - -1. Let ```free_raw_data=True```(default is ```True```) when constructing the ```Dataset``` -2. Explicit set ```raw_data=None``` after the ```Dataset``` has been constructed -3. Call ```gc``` - -Setting Parameters ------------------- - -LightGBM can use either a list of pairs or a dictionary to set [Parameters](./Parameters.md). For instance: - -* Booster parameters: - -```python -param = {'num_leaves':31, 'num_trees':100, 'objective':'binary'} -param['metric'] = 'auc' -``` - -* You can also specify multiple eval metrics: - -```python -param['metric'] = ['auc', 'binary_logloss'] -``` - -Training --------- - -Training a model requires a parameter list and data set. - -```python -num_round = 10 -bst = lgb.train(param, train_data, num_round, valid_sets=[test_data]) -``` - -After training, the model can be saved. - -```python -bst.save_model('model.txt') -``` - -The trained model can also be dumped to JSON format. - -```python -# dump model -json_model = bst.dump_model() -``` - -A saved model can be loaded. - -```python -bst = lgb.Booster(model_file='model.txt') #init model -``` - -CV --- - -Training with 5-fold CV: - -```python -num_round = 10 -lgb.cv(param, train_data, num_round, nfold=5) -``` - -Early Stopping --------------- - -If you have a validation set, you can use early stopping to find the optimal number of boosting rounds. -Early stopping requires at least one set in `valid_sets`. If there's more than one, it will use all of them. - -```python -bst = lgb.train(param, train_data, num_round, valid_sets=valid_sets, early_stopping_rounds=10) -bst.save_model('model.txt', num_iteration=bst.best_iteration) -``` - -The model will train until the validation score stops improving. Validation error needs to improve at least every `early_stopping_rounds` to continue training. - -If early stopping occurs, the model will have an additional field: `bst.best_iteration`. Note that `train()` will return a model from the last iteration, not the best one. And you can set `num_iteration=bst.best_iteration` when saving model. - -This works with both metrics to minimize (L2, log loss, etc.) and to maximize (NDCG, AUC). Note that if you specify more than one evaluation metric, all of them will be used for early stopping. - -Prediction ----------- - -A model that has been trained or loaded can perform predictions on data sets. - -```python -# 7 entities, each contains 10 features -data = np.random.rand(7, 10) -ypred = bst.predict(data) -``` - -If early stopping is enabled during training, you can get predictions from the best iteration with `bst.best_iteration`: - -```python -ypred = bst.predict(data, num_iteration=bst.best_iteration) -``` diff --git a/docs/Quick-Start.md b/docs/Quick-Start.md deleted file mode 100644 index 2fed71e66..000000000 --- a/docs/Quick-Start.md +++ /dev/null @@ -1,118 +0,0 @@ -# Quick Start - -This is a quick start guide for LightGBM of cli version. - -Follow the [Installation Guide](./Installation-Guide.rst) to install LightGBM first. - -***List of other Helpful Links*** -* [Parameters](./Parameters.md) -* [Parameters Tuning](./Parameters-tuning.md) -* [Python-package Quick Start](./Python-intro.md) -* [Python API](./Python-API.rst) - -## Training Data Format - -LightGBM supports input data file with [CSV](https://en.wikipedia.org/wiki/Comma-separated_values), [TSV](https://en.wikipedia.org/wiki/Tab-separated_values) and [LibSVM](https://www.csie.ntu.edu.tw/~cjlin/libsvm/) formats. - -Label is the data of first column, and there is no header in the file. - -### Categorical Feature Support - -update 12/5/2016: - -LightGBM can use categorical feature directly (without one-hot coding). The experiment on [Expo data](http://stat-computing.org/dataexpo/2009/) shows about 8x speed-up compared with one-hot coding. - -For the setting details, please refer to [Parameters](./Parameters.md). - -### Weight and Query/Group Data - -LightGBM also support weighted training, it needs an additional [weight data](./Parameters.md). And it needs an additional [query data](./Parameters.md) for ranking task. - -update 11/3/2016: - -1. support input with header now -2. can specific label column, weight column and query/group id column. Both index and column are supported -3. can specific a list of ignored columns - -## Parameter Quick Look - -The parameter format is ```key1=value1 key2=value2 ... ``` . And parameters can be in both config file and command line. - -Some important parameters: - -* ```config```, default=```""```, type=string, alias=```config_file``` - * path of config file -* ```task```, default=```train```, type=enum, options=```train```,```prediction``` - * ```train``` for training - * ```prediction``` for prediction. -* `application`, default=`regression`, type=enum, options=`regression`,`regression_l1`,`huber`,`fair`,`poisson`,`binary`,`lambdarank`,`multiclass`, alias=`objective`,`app` - * `regression`, regression application - * `regression_l2`, L2 loss, alias=`mean_squared_error`,`mse` - * `regression_l1`, L1 loss, alias=`mean_absolute_error`,`mae` - * `huber`, [Huber loss](https://en.wikipedia.org/wiki/Huber_loss "Huber loss - Wikipedia") - * `fair`, [Fair loss](https://www.kaggle.com/c/allstate-claims-severity/discussion/24520) - * `poisson`, [Poisson regression](https://en.wikipedia.org/wiki/Poisson_regression "Poisson regression") - * `binary`, binary classification application - * `lambdarank`, [lambdarank](https://papers.nips.cc/paper/2971-learning-to-rank-with-nonsmooth-cost-functions.pdf) application - * The label should be `int` type in lambdarank tasks, and larger number represent the higher relevance (e.g. 0:bad, 1:fair, 2:good, 3:perfect). - * `label_gain` can be used to set the gain(weight) of `int` label. - * `multiclass`, multi-class classification application, should set `num_class` as well -* `boosting`, default=`gbdt`, type=enum, options=`gbdt`,`rf`,`dart`,`goss`, alias=`boost`,`boosting_type` - * `gbdt`, traditional Gradient Boosting Decision Tree - * `rf`, Random Forest - * `dart`, [Dropouts meet Multiple Additive Regression Trees](https://arxiv.org/abs/1505.01866) - * `goss`, Gradient-based One-Side Sampling -* ```data```, default=```""```, type=string, alias=```train```,```train_data``` - * training data, LightGBM will train from this data -* ```valid```, default=```""```, type=multi-string, alias=```test```,```valid_data```,```test_data``` - * validation/test data, LightGBM will output metrics for these data - * support multi validation data, separate by ```,``` -* ```num_iterations```, default=```100```, type=int, alias=```num_iteration```,```num_tree```,```num_trees```,```num_round```,```num_rounds``` - * number of boosting iterations/trees -* ```learning_rate```, default=```0.1```, type=double, alias=```shrinkage_rate``` - * shrinkage rate -* ```num_leaves```, default=```31```, type=int, alias=```num_leaf``` - * number of leaves in one tree -* ```tree_learner```, default=```serial```, type=enum, options=```serial```,```feature```,```data``` - * ```serial```, single machine tree learner - * ```feature```, feature parallel tree learner - * ```data```, data parallel tree learner - * Refer to [Parallel Learning Guide](./Parallel-Learning-Guide.rst) to get more details. -* ```num_threads```, default=OpenMP_default, type=int, alias=```num_thread```,```nthread``` - * Number of threads for LightGBM. - * For the best speed, set this to the number of **real CPU cores**, not the number of threads (most CPU using [hyper-threading](https://en.wikipedia.org/wiki/Hyper-threading) to generate 2 threads per CPU core). - * For parallel learning, should not use full CPU cores since this will cause poor performance for the network. -* ```max_depth```, default=```-1```, type=int - * Limit the max depth for tree model. This is used to deal with overfit when #data is small. Tree still grow by leaf-wise. - * ```< 0``` means no limit -* ```min_data_in_leaf```, default=```20```, type=int, alias=```min_data_per_leaf``` , ```min_data``` - * Minimal number of data in one leaf. Can use this to deal with over-fit. -* ```min_sum_hessian_in_leaf```, default=```1e-3```, type=double, alias=```min_sum_hessian_per_leaf```, ```min_sum_hessian```, ```min_hessian``` - * Minimal sum hessian in one leaf. Like ```min_data_in_leaf```, can use this to deal with over-fit. - -For all parameters, please refer to [Parameters](./Parameters.md). - -## Run LightGBM - -For Windows: -``` -lightgbm.exe config=your_config_file other_args ... -``` - -For Unix: -``` -./lightgbm config=your_config_file other_args ... -``` - -Parameters can be both in the config file and command line, and the parameters in command line have higher priority than in config file. -For example, following command line will keep 'num_trees=10' and ignore same parameter in config file. -``` -./lightgbm config=train.conf num_trees=10 -``` - -## Examples - -* [Binary Classification](https://github.com/Microsoft/LightGBM/tree/master/examples/binary_classification) -* [Regression](https://github.com/Microsoft/LightGBM/tree/master/examples/regression) -* [Lambdarank](https://github.com/Microsoft/LightGBM/tree/master/examples/lambdarank) -* [Parallel Learning](https://github.com/Microsoft/LightGBM/tree/master/examples/parallel_learning) diff --git a/docs/Quick-Start.rst b/docs/Quick-Start.rst new file mode 100644 index 000000000..8199475db --- /dev/null +++ b/docs/Quick-Start.rst @@ -0,0 +1,219 @@ +Quick Start +=========== + +This is a quick start guide for LightGBM CLI version. + +Follow the `Installation Guide <./Installation-Guide.rst>`__ to install LightGBM first. + +**List of other helpful links** + +- `Parameters <./Parameters.rst>`__ + +- `Parameters Tuning <./Parameters-Tuning.rst>`__ + +- `Python-package Quick Start <./Python-Intro.rst>`__ + +- `Python API <./Python-API.rst>`__ + +Training Data Format +-------------------- + +LightGBM supports input data file with `CSV`_, `TSV`_ and `LibSVM`_ formats. + +Label is the data of first column, and there is no header in the file. + +Categorical Feature Support +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +update 12/5/2016: + +LightGBM can use categorical feature directly (without one-hot coding). +The experiment on `Expo data`_ shows about 8x speed-up compared with one-hot coding. + +For the setting details, please refer to `Parameters <./Parameters.rst>`__. + +Weight and Query/Group Data +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +LightGBM also support weighted training, it needs an additional `weight data <./Parameters.rst#io-parameters>`__. +And it needs an additional `query data <./Parameters.rst#io-parameters>`_ for ranking task. + +update 11/3/2016: + +1. support input with header now + +2. can specific label column, weight column and query/group id column. + Both index and column are supported + +3. can specific a list of ignored columns + +Parameter Quick Look +-------------------- + +The parameter format is ``key1=value1 key2=value2 ...``. +And parameters can be in both config file and command line. + +Some important parameters: + +- ``config``, default=\ ``""``, type=string, alias=\ ``config_file`` + + - path to config file + +- ``task``, default=\ ``train``, type=enum, options=\ ``train``, ``prediction`` + + - ``train`` for training + + - ``prediction`` for prediction + +- ``application``, default=\ ``regression``, type=enum, + options=\ ``regression``, ``regression_l2``, ``regression_l1``, ``huber``, ``fair``, ``poisson``, ``binary``, ``lambdarank``, ``multiclass``, + alias=\ ``objective``, ``app`` + + - ``regression``, regression application + + - ``regression_l2``, L2 loss, alias=\ ``mean_squared_error``, ``mse`` + + - ``regression_l1``, L1 loss, alias=\ ``mean_absolute_error``, ``mae`` + + - ``huber``, `Huber loss`_ + + - ``fair``, `Fair loss`_ + + - ``poisson``, `Poisson regression`_ + + - ``binary``, binary classification application + + - ``lambdarank``, `lambdarank`_ application + + - the label should be ``int`` type in lambdarank tasks, + and larger number represent the higher relevance (e.g. 0:bad, 1:fair, 2:good, 3:perfect) + + - ``label_gain`` can be used to set the gain(weight) of ``int`` label. + + - ``multiclass``, multi-class classification application, ``num_class`` should be set as well + +- ``boosting``, default=\ ``gbdt``, type=enum, + options=\ ``gbdt``, ``rf``, ``dart``, ``goss``, + alias=\ ``boost``, ``boosting_type`` + + - ``gbdt``, traditional Gradient Boosting Decision Tree + + - ``rf``, Random Forest + + - ``dart``, `Dropouts meet Multiple Additive Regression Trees`_ + + - ``goss``, Gradient-based One-Side Sampling + +- ``data``, default=\ ``""``, type=string, alias=\ ``train``, ``train_data`` + + - training data, LightGBM will train from this data + +- ``valid``, default=\ ``""``, type=multi-string, alias=\ ``test``, ``valid_data``, ``test_data`` + + - validation/test data, LightGBM will output metrics for these data + + - support multi validation data, separate by ``,`` + +- ``num_iterations``, default=\ ``100``, type=int, + alias=\ ``num_iteration``, ``num_tree``, ``num_trees``, ``num_round``, ``num_rounds`` + + - number of boosting iterations/trees + +- ``learning_rate``, default=\ ``0.1``, type=double, alias=\ ``shrinkage_rate`` + + - shrinkage rate + +- ``num_leaves``, default=\ ``31``, type=int, alias=\ ``num_leaf`` + + - number of leaves in one tree + +- ``tree_learner``, default=\ ``serial``, type=enum, options=\ ``serial``, ``feature``, ``data`` + + - ``serial``, single machine tree learner + + - ``feature``, feature parallel tree learner + + - ``data``, data parallel tree learner + + - refer to `Parallel Learning Guide <./Parallel-Learning-Guide.rst>`__ to get more details + +- ``num_threads``, default=\ ``OpenMP_default``, type=int, alias=\ ``num_thread``, ``nthread`` + + - number of threads for LightGBM + + - for the best speed, set this to the number of **real CPU cores**, + not the number of threads (most CPU using `hyper-threading`_ to generate 2 threads per CPU core) + + - for parallel learning, should not use full CPU cores since this will cause poor performance for the network + +- ``max_depth``, default=\ ``-1``, type=int + + - limit the max depth for tree model. + This is used to deal with overfit when ``#data`` is small. + Tree still grow by leaf-wise + + - ``< 0`` means no limit + +- ``min_data_in_leaf``, default=\ ``20``, type=int, alias=\ ``min_data_per_leaf`` , ``min_data`` + + - minimal number of data in one leaf. Can use this to deal with over-fitting + +- ``min_sum_hessian_in_leaf``, default=\ ``1e-3``, type=double, + alias=\ ``min_sum_hessian_per_leaf``, ``min_sum_hessian``, ``min_hessian`` + + - minimal sum hessian in one leaf. Like ``min_data_in_leaf``, can be used to deal with over-fitting + +For all parameters, please refer to `Parameters <./Parameters.rst>`__. + +Run LightGBM +------------ + +For Windows: + +:: + + lightgbm.exe config=your_config_file other_args ... + +For Unix: + +:: + + ./lightgbm config=your_config_file other_args ... + +Parameters can be both in the config file and command line, and the parameters in command line have higher priority than in config file. +For example, following command line will keep ``num_trees=10`` and ignore the same parameter in config file. + +:: + + ./lightgbm config=train.conf num_trees=10 + +Examples +-------- + +- `Binary Classification `__ + +- `Regression `__ + +- `Lambdarank `__ + +- `Parallel Learning `__ + +.. _CSV: https://en.wikipedia.org/wiki/Comma-separated_values + +.. _TSV: https://en.wikipedia.org/wiki/Tab-separated_values + +.. _LibSVM: https://www.csie.ntu.edu.tw/~cjlin/libsvm/ + +.. _Expo data: http://stat-computing.org/dataexpo/2009/ + +.. _Huber loss: https://en.wikipedia.org/wiki/Huber_loss + +.. _Fair loss: https://www.kaggle.com/c/allstate-claims-severity/discussion/24520 + +.. _Poisson regression: https://en.wikipedia.org/wiki/Poisson_regression + +.. _lambdarank: https://papers.nips.cc/paper/2971-learning-to-rank-with-nonsmooth-cost-functions.pdf + +.. _Dropouts meet Multiple Additive Regression Trees: https://arxiv.org/abs/1505.01866 + +.. _hyper-threading: https://en.wikipedia.org/wiki/Hyper-threading diff --git a/docs/README.md b/docs/README.md deleted file mode 100644 index f5857f0cb..000000000 --- a/docs/README.md +++ /dev/null @@ -1,14 +0,0 @@ -# Documentation - -Documentation for LightGBM is generated using [Sphinx](http://www.sphinx-doc.org/) and [recommonmark](https://recommonmark.readthedocs.io/). - -After each commit on `master`, documentation is updated and published to [https://lightgbm.readthedocs.io/](https://lightgbm.readthedocs.io/). - -## Build - -You can build the documentation locally. Just run in `docs` folder: - -```sh -pip install -r requirements.txt -make html -``` diff --git a/docs/README.rst b/docs/README.rst new file mode 100644 index 000000000..0e457b399 --- /dev/null +++ b/docs/README.rst @@ -0,0 +1,16 @@ +Documentation +============= + +Documentation for LightGBM is generated using `Sphinx `__. + +After each commit on ``master``, documentation is updated and published to `Read the Docs `__. + +Build +----- + +You can build the documentation locally. Just run in ``docs`` folder: + +.. code:: sh + + pip install sphinx sphinx_rtd_theme + make html diff --git a/docs/_static/images/gcc-bars.png b/docs/_static/images/gcc-bars.png new file mode 100644 index 0000000000000000000000000000000000000000..09a6f33c24bc514cdaf42729b74ae951561f5506 GIT binary patch literal 61927 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 literal 0 HcmV?d00001 diff --git a/docs/_static/images/gcc-chart.png b/docs/_static/images/gcc-chart.png new file mode 100644 index 0000000000000000000000000000000000000000..f6890c62afa3c94177d593e6cf4dc0935b2e686d GIT binary patch literal 85809 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�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 literal 0 HcmV?d00001 diff --git a/docs/_static/images/gcc-comparison-1.png b/docs/_static/images/gcc-comparison-1.png new file mode 100644 index 0000000000000000000000000000000000000000..baab5f81b5a51f99390ef6dfd8427c931c5f2b12 GIT binary patch literal 28801 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 z zlC1);o#BJT<)*3L|q$W(OLlKZaTW2b!nEMh*kq9}@*hS8baj5EhomMPG-{l#52{X|vHn-J1 zyLc(p2@ny;<}$Kwk&p-wt!-mSbZY=G309KqgQcKUJ%u$Fi8Xe#^#*0FvDtc2`dLw$ z39zc^$4f`S^~4UD5xHvFBpyF_o1}?*{exLh1jzi{2ndC&N_*iJZHD=sBFJP&1yziR z-43ouKXQCH7tlw>`-(;48qGc!!owVu(@TUs-a5()k|n%Sa%8Ty}V(}HAA2< zDcP-}&XYV+3cA!n8zf>lVn*paWFoJ)dy#OXFsIv&Me?j(n4V8= zd)@<$ZOdj%eT!SBPOE+0djelQ{K&^T=`mxbPIk!kHx@B&Zy|W4zdgjgU;6vud5Gv> z33c#dU*YBFOLoyM&odvx6ECZ1_tG;02&7H4Y24_jfdeZ^#V*S6BLO#oWpXk$36;JE zah8zRBtIbeYUSoHCsDAJzos2;j%fOz(C(`$+Wx$CeQqiNRA+6*^99ZSn^GwqkN zsUhMD$&q=8WKcz7VISp;$6TAf#BFDm9oVX8)>`yZ{T6f<Nz_@} zvLGN%%gG9J!=fHgw4?$gSFH!>XRzT#=WkA*D2ZZl`wNW~Af^6c3Ye1M&d(h12+U=J zVb{-n^Z1e{E|XGM603!Ppzy?dGaf-V;qhDmMcSWGDOuoD2y8j7H1tKd#ci{j6)X1W zct-E;<(C#a#|H~2oA}MBf0zdkkTy)j5|qRwL5GY#5jz6JGz9VqzP)i;$MA2UXz2-! z3`um&bbp{x*6R;gH zPXzujXQ3bfDY{qZy5qzt|HVmfBuxV~wBp&E?x4fIzNgYZpwdpzltF1WO<^GZ{?8it z&l3q!SAHG1UNga!v0YUG$lbHT(t>5a(UC9(YZHsPO(I z*9Gz4Uxd@i$kUfA!sAk!R97C!cS&^b0fn|>7hNz(txylZ=N6745{N<7P51s$FZkvE zU&q{^hpKv2IH#I&l1_ek>5aHm?_^26AVbI{E<+r)aOj_aMjH>S5BpjA$>m?E$B)3{ z=j~`q^gsYKtbex&sNobop8sHn+fMZG&;sk7PakkHkl^s}u>PB66+-@ID>!Yo*BM;< z{}pBZGr!Q#Ku$CUIo~BxolwiJjaPs~Bir8#D6p=D>|SphieFU#2aR@M?-`$!?A?;S zW(+2EwEO00n<*n3pD#36;Zn1|Br3pV2iNJEmKNE;!TqcgS+v<)+uO65Sz280Zb4SvF5h=(

ahdvCkEz? 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 z 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 literal 0 HcmV?d00001 diff --git a/docs/_static/images/gcc-table.png b/docs/_static/images/gcc-table.png new file mode 100644 index 0000000000000000000000000000000000000000..2a91e70a54b49b4b19671ec9e97cf396ab2bddf7 GIT binary patch literal 135557 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

  • Pkcq0%8p2;W2J~G7O@hM2^U>fN>lgOd% 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 JS?83{1OPbNC)NM} literal 0 HcmV?d00001 diff --git a/docs/_static/js/rst_links_fix.js b/docs/_static/js/rst_links_fix.js index 26bcc2d2a..9fab7c8e2 100644 --- a/docs/_static/js/rst_links_fix.js +++ b/docs/_static/js/rst_links_fix.js @@ -1,4 +1,4 @@ -window.onload = function() { - $('a[href^="./"][href$=".md"]').attr('href', (i, val) => { return val.replace('.md', '.html'); }); /* Replace '.md' with '.html' in all internal links like './[Something].md' */ - $('a[href^="./"][href$=".rst"]').attr('href', (i, val) => { return val.replace('.rst', '.html'); }); /* Replace '.rst' with '.html' in all internal links like './[Something].rst' */ -} +$(function() { + $('a[href^="./"][href*=".rst"]').attr('href', (i, val) => { return val.replace('.rst', '.html'); }); /* Replace '.rst' with '.html' in all internal links like './[Something].rst[#anchor]' */ + $('.wy-nav-content').each(function () { this.style.setProperty('max-width', 'none', 'important'); }); +}); diff --git a/docs/conf.py b/docs/conf.py index 6a96a3b7b..5c3a3bb07 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -19,14 +19,13 @@ # import os import sys +import sphinx +from sphinx.errors import VersionRequirementError curr_path = os.path.dirname(os.path.realpath(__file__)) libpath = os.path.join(curr_path, '../python-package/') sys.path.insert(0, libpath) -from recommonmark.parser import CommonMarkParser -from recommonmark.transform import AutoStructify - # -- mock out modules from unittest.mock import Mock MOCK_MODULES = [ @@ -42,8 +41,10 @@ for mod_name in MOCK_MODULES: os.environ['LIGHTGBM_BUILD_DOC'] = '1' # If your documentation needs a minimal Sphinx version, state it here. -# -# needs_sphinx = '1.0' +needs_sphinx = '1.3' # Due to sphinx.ext.napoleon +if needs_sphinx > sphinx.__version__: + message = 'This project needs at least Sphinx v%s' % needs_sphinx + raise VersionRequirementError(message) # Add any Sphinx extension module names here, as strings. They can be # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom @@ -60,10 +61,7 @@ templates_path = ['_templates'] # The suffix(es) of source filenames. # You can specify multiple suffix as a list of string: -source_parsers = { - '.md': CommonMarkParser, -} -source_suffix = ['.rst', '.md'] +# source_suffix = ['.rst', '.md'] # The master toctree document. master_doc = 'index' @@ -151,20 +149,20 @@ latex_elements = { # Grouping the document tree into LaTeX files. List of tuples # (source start file, target name, title, # author, documentclass [howto, manual, or own class]). -latex_documents = [ - (master_doc, 'LightGBM.tex', 'LightGBM Documentation', - 'Microsoft Corporation', 'manual'), -] +# latex_documents = [ +# (master_doc, 'LightGBM.tex', 'LightGBM Documentation', +# 'Microsoft Corporation', 'manual'), +# ] # -- Options for manual page output --------------------------------------- # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). -man_pages = [ - (master_doc, 'lightgbm', 'LightGBM Documentation', - [author], 1) -] +# man_pages = [ +# (master_doc, 'lightgbm', 'LightGBM Documentation', +# [author], 1) +# ] # -- Options for Texinfo output ------------------------------------------- @@ -172,19 +170,12 @@ man_pages = [ # Grouping the document tree into Texinfo files. List of tuples # (source start file, target name, title, author, # dir menu entry, description, category) -texinfo_documents = [ - (master_doc, 'LightGBM', 'LightGBM Documentation', - author, 'LightGBM', 'One line description of project.', - 'Miscellaneous'), -] +# texinfo_documents = [ +# (master_doc, 'LightGBM', 'LightGBM Documentation', +# author, 'LightGBM', 'One line description of project.', +# 'Miscellaneous'), +# ] -# https://recommonmark.readthedocs.io/en/latest/ -github_doc_root = 'https://github.com/Microsoft/LightGBM/tree/master/docs/' def setup(app): - app.add_config_value('recommonmark_config', { - 'url_resolver': lambda url: github_doc_root + url, - 'auto_toc_tree_section': 'Contents', - }, True) - app.add_transform(AutoStructify) app.add_javascript("js/rst_links_fix.js") diff --git a/docs/gcc-Tips.rst b/docs/gcc-Tips.rst new file mode 100644 index 000000000..cc28e77ec --- /dev/null +++ b/docs/gcc-Tips.rst @@ -0,0 +1,51 @@ +Recommendations When Using gcc +============================== + +It is recommended to use ``-O3 -mtune=native`` to achieve maximum speed during LightGBM training. + +Using Intel Ivy Bridge CPU on 1M x 1K Bosch dataset, the performance increases as follow: + ++-------------------------------------+---------------------+ +| Compilation Flag | Performance Index | ++=====================================+=====================+ +| ``-O2 -mtune=core2`` | 100.00% | ++-------------------------------------+---------------------+ +| ``-O2 -mtune=native`` | 100.90% | ++-------------------------------------+---------------------+ +| ``-O3 -mtune=native`` | 102.78% | ++-------------------------------------+---------------------+ +| ``-O3 -ffast-math -mtune=native`` | 100.64% | ++-------------------------------------+---------------------+ + +You can find more details on the experimentation below: + +- `Laurae++/Benchmarks `__ + +- `Laurae2/gbt\_benchmarks `__ + +- `Laurae's Benchmark Master Data (Interactive) `__ + +- `Kaggle Paris Meetup #12 Slides `__ + +Some explanatory pictures: + +.. image:: ./_static/images/gcc-table.png + :align: center + +.. image:: ./_static/images/gcc-bars.png + :align: center + +.. image:: ./_static/images/gcc-chart.png + :align: center + +.. image:: ./_static/images/gcc-comparison-1.png + :align: center + +.. image:: ./_static/images/gcc-comparison-2.png + :align: center + +.. image:: ./_static/images/gcc-meetup-1.png + :align: center + +.. image:: ./_static/images/gcc-meetup-2.png + :align: center diff --git a/docs/gcc-tips.Rmd b/docs/gcc-tips.Rmd deleted file mode 100644 index a47e8adf6..000000000 --- a/docs/gcc-tips.Rmd +++ /dev/null @@ -1,35 +0,0 @@ -# Recommendations when using gcc - -It is recommended to use `-O3 -mtune=native` to achieve maximum speed during LightGBM training. - -Using Intel Ivy Bridge CPU on 1M x 1K Bosch dataset, the performance increases as follow: - -| Compilation Flag | Performance Index | -| --- | ---: | -| `-O2 -mtune=core2` | 100.00% | -| `-O2 -mtune=native` | 100.90% | -| `-O3 -mtune=native` | 102.78% | -| `-O3 -ffast-math -mtune=native` | 100.64% | - -You can find more details on the experimentation below: - -* [Laurae++/Benchmarks](https://sites.google.com/view/lauraepp/benchmarks) -* [Laurae2/gbt_benchmarks](https://github.com/Laurae2/gbt_benchmarks) -* [Laurae's Benchmark Master Data (Interactive)](https://public.tableau.com/views/gbt_benchmarks/Master-Data?:showVizHome=no) -* [Kaggle Paris Meetup #12 Slides](https://drive.google.com/file/d/0B6qJBmoIxFe0ZHNCOXdoRWMxUm8/view) - -Some pictures below: - -![gcc table](https://cloud.githubusercontent.com/assets/9083669/26027337/c376e22e-380c-11e7-91bc-fe0a333c03e9.png) - -![gcc bars](https://cloud.githubusercontent.com/assets/9083669/26027338/d1caebcc-380c-11e7-864e-d704b39f1e63.png) - -![gcc chart](https://cloud.githubusercontent.com/assets/9083669/26027353/e1bdb866-380c-11e7-97b5-22c7eac349b2.png) - -![gcc comparison 1](https://cloud.githubusercontent.com/assets/9083669/26027401/c31f2f74-380d-11e7-857a-f5119791bed7.png) - -![gcc comparison 2](https://cloud.githubusercontent.com/assets/9083669/26027486/d7d7e72a-380e-11e7-86c3-ccbbf42a9c55.png) - -![gcc meetup 1](https://cloud.githubusercontent.com/assets/9083669/26027427/21b38f44-380e-11e7-9c95-05437782dd46.png) - -![gcc meetup 2](https://cloud.githubusercontent.com/assets/9083669/26027433/362be250-380e-11e7-8982-76ac167bcd3e.png) diff --git a/docs/index.rst b/docs/index.rst index adbd6e9d8..d0cbe37a6 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -12,17 +12,17 @@ Welcome to LightGBM's documentation! Installation Guide Quick Start - Python Quick Start + Python Quick Start Features Experiments Parameters - Parameters Tuning + Parameters Tuning Python API Parallel Learning Guide GPU Tutorial - Advanced Topics + Advanced Topics FAQ - Development Guide + Development Guide Indices and Tables ================== diff --git a/docs/requirements.txt b/docs/requirements.txt deleted file mode 100644 index b0bd38902..000000000 --- a/docs/requirements.txt +++ /dev/null @@ -1,4 +0,0 @@ -sphinx<=1.5.6 -sphinxcontrib-napoleon -sphinx_rtd_theme -recommonmark diff --git a/python-package/README.rst b/python-package/README.rst index ddae4e81e..c1a6bb693 100644 --- a/python-package/README.rst +++ b/python-package/README.rst @@ -88,7 +88,7 @@ Refer to the walk through examples in `Python guide folder `_. +Refer to `FAQ `_. Developments ------------