{"about":{"site":"https://codewithpapers.app","non_affiliation":"Code with Papers and Syntology are not affiliated with, endorsed by, or sponsored by Papers with Code, Meta, or the pwc-archive mirror.","licence":"CC BY-SA 4.0","licence_url":"https://creativecommons.org/licenses/by-sa/4.0/legalcode","attribution":"https://codewithpapers.app/attribution","modified":"archive material modified by Syntology; see the attribution page"},"url":"/paper/gputreeshap-fast-parallel-tree","title":"GPUTreeShap: Massively Parallel Exact Calculation of SHAP Scores for Tree Ensembles","arxiv_id":"2010.13972","date":"2020-10-27","proceeding":null,"authors":["Rory Mitchell","Eibe Frank","Geoffrey Holmes"],"abstract":"SHAP (SHapley Additive exPlanation) values provide a game theoretic interpretation of the predictions of machine learning models based on Shapley values. While exact calculation of SHAP values is computationally intractable in general, a recursive polynomial-time algorithm called TreeShap is available for decision tree models. However, despite its polynomial time complexity, TreeShap can become a significant bottleneck in practical machine learning pipelines when applied to large decision tree ensembles. Unfortunately, the complicated TreeShap algorithm is difficult to map to hardware accelerators such as GPUs. In this work, we present GPUTreeShap, a reformulated TreeShap algorithm suitable for massively parallel computation on graphics processing units. Our approach first preprocesses each decision tree to isolate variable sized sub-problems from the original recursive algorithm, then solves a bin packing problem, and finally maps sub-problems to single-instruction, multiple-thread (SIMT) tasks for parallel execution with specialised hardware instructions. With a single NVIDIA Tesla V100-32 GPU, we achieve speedups of up to 19x for SHAP values, and speedups of up to 340x for SHAP interaction values, over a state-of-the-art multi-core CPU implementation executed on two 20-core Xeon E5-2698 v4 2.2 GHz CPUs. We also experiment with multi-GPU computing using eight V100 GPUs, demonstrating throughput of 1.2M rows per second -- equivalent CPU-based performance is estimated to require 6850 CPU cores.","url_abs":"https://arxiv.org/abs/2010.13972v3","url_pdf":"https://arxiv.org/pdf/2010.13972v3.pdf","source":{"archive":"pwc-archive (Hugging Face), CC BY-SA 4.0","snapshot":"2025-07-28","licence_url":"https://creativecommons.org/licenses/by-sa/4.0/legalcode","row_kind":"abstracts"},"code_links":[{"paper_slug":"gputreeshap-fast-parallel-tree","repo_url":"https://github.com/rapidsai/gputreeshap","is_official":1,"mentioned_in_paper":1,"mentioned_in_github":1,"framework":"none","reach":{"status":"ok","spdx":"Apache-2.0"}},{"paper_slug":"gputreeshap-fast-parallel-tree","repo_url":"https://github.com/shap/shap","is_official":0,"mentioned_in_paper":0,"mentioned_in_github":1,"framework":"tf","reach":null},{"paper_slug":"gputreeshap-fast-parallel-tree","repo_url":"https://github.com/slundberg/esvalues","is_official":0,"mentioned_in_paper":0,"mentioned_in_github":1,"framework":"tf","reach":{"status":"ok","spdx":"MIT"}},{"paper_slug":"gputreeshap-fast-parallel-tree","repo_url":"https://github.com/slundberg/shap","is_official":0,"mentioned_in_paper":0,"mentioned_in_github":1,"framework":"tf","reach":{"status":"ok","spdx":"MIT"}}],"tasks":[{"task_slug":"machine-learning","task_name":"BIG-bench Machine Learning"},{"task_slug":null,"task_name":"CPU"},{"task_slug":null,"task_name":"GPU"}],"methods":[{"method_slug":"shap","method_name":"SHAP"}],"datasets_introduced":[],"methods_introduced":[],"results":[],"syntology":{"atlas_url":"https://app.syntology.ai/?focus=2010.13972","mcp":{"get_harvested_code_for_paper":{"arxiv_id":"2010.13972"}},"developers":"https://syntology.ai/developers","read_at":"2026-09-24T18:15:14+00:00","read_at_is":"when the build read Syntology's graph, not when any sample ran","claim":"Per-sample execution status on synthesized fixtures; not a correctness claim about the paper. Samples come from repositories linked to the paper, official or community; repo_kind says which.","repos":[{"provenance":"external:paperswithcode_snapshot_2025-07-28","url":"https://github.com/slundberg/esvalues","reach":{"status":"ok","spdx":"MIT"}},{"provenance":"external:paperswithcode_snapshot_2025-07-28","url":"https://github.com/slundberg/shap","reach":{"status":"ok","spdx":"MIT"}},{"provenance":"external:paperswithcode_snapshot_2025-07-28","url":"https://github.com/shap/shap","reach":null},{"provenance":"external:paperswithcode_snapshot_2025-07-28","url":"https://github.com/rapidsai/gputreeshap","reach":{"status":"ok","spdx":"Apache-2.0"}}],"summary":{"ran":4,"unverified":4},"by_repo_kind":{"listed":{"samples":8,"ran":4,"repositories":2}},"repo_kind_vocabulary":{"official":"The archive marks this repository official for the paper","named_in_paper":"The archive records that the paper mentions this repository; it is not marked official","listed":"In the archive's code links for this paper, not marked official and not recorded as mentioned in the paper","found_in_text":"Syntology found this repository in the paper's own text; whether it is the authors' implementation is not asserted","community":"Not in the archive's code links for this paper; a community repository Syntology harvested"},"n_pointer_only_for_licence":0,"samples":[{"code_sha256_prefix":"9a8714c1d8f19c47","entry":"compute_output_dims","repo":"slundberg/esvalues","repo_kind":"listed","path":"shap/_explanation.py","file_url":"https://github.com/slundberg/esvalues/blob/HEAD/shap/_explanation.py","link_basis":"plan_row","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"9a8714c1d8f19c47"}},{"code_sha256_prefix":"db29607e6029d39f","entry":"identity","repo":"slundberg/esvalues","repo_kind":"listed","path":"shap/links.py","file_url":"https://github.com/slundberg/esvalues/blob/HEAD/shap/links.py","link_basis":"plan_row","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":true,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"db29607e6029d39f"}},{"code_sha256_prefix":"2ce33a90fabc6cd6","entry":"link_reweighting","repo":"slundberg/shap","repo_kind":"listed","path":"shap/utils/_masked_model.py","file_url":"https://github.com/slundberg/shap/blob/HEAD/shap/utils/_masked_model.py","link_basis":"plan_row","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"2ce33a90fabc6cd6"}},{"code_sha256_prefix":"ff39ee5daf145263","entry":"logit","repo":"slundberg/esvalues","repo_kind":"listed","path":"shap/links.py","file_url":"https://github.com/slundberg/esvalues/blob/HEAD/shap/links.py","link_basis":"plan_row","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":true,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"ff39ee5daf145263"}},{"code_sha256_prefix":"ac9715771309b34c","entry":"coef","repo":"slundberg/esvalues","repo_kind":"listed","path":"shap/benchmark/methods.py","file_url":"https://github.com/slundberg/esvalues/blob/HEAD/shap/benchmark/methods.py","link_basis":"plan_row","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"ac9715771309b34c"}},{"code_sha256_prefix":"30c80905de82e540","entry":"linear_shap_corr","repo":"slundberg/esvalues","repo_kind":"listed","path":"shap/benchmark/methods.py","file_url":"https://github.com/slundberg/esvalues/blob/HEAD/shap/benchmark/methods.py","link_basis":"plan_row","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"30c80905de82e540"}},{"code_sha256_prefix":"82235fa109121626","entry":"linear_shap_ind","repo":"slundberg/esvalues","repo_kind":"listed","path":"shap/benchmark/methods.py","file_url":"https://github.com/slundberg/esvalues/blob/HEAD/shap/benchmark/methods.py","link_basis":"plan_row","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"82235fa109121626"}},{"code_sha256_prefix":"66df016e1814153a","entry":"make_masks","repo":"slundberg/shap","repo_kind":"listed","path":"shap/utils/_masked_model.py","file_url":"https://github.com/slundberg/shap/blob/HEAD/shap/utils/_masked_model.py","link_basis":"plan_row","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"66df016e1814153a"}}]},"arxiv_metadata":null,"syntology_extracted_results":null}