File: test_openmp.py

package info (click to toggle)
xgboost 3.0.0-1
  • links: PTS, VCS
  • area: main
  • in suites: trixie
  • size: 13,796 kB
  • sloc: cpp: 67,502; python: 35,503; java: 4,676; ansic: 1,426; sh: 1,320; xml: 1,197; makefile: 204; javascript: 19
file content (108 lines) | stat: -rw-r--r-- 3,285 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
import os
import subprocess
import tempfile

import numpy as np
import pytest

import xgboost as xgb
from xgboost import testing as tm

pytestmark = tm.timeout(10)


class TestOMP:
    def test_omp(self):
        dtrain, dtest = tm.load_agaricus(__file__)

        param = {'booster': 'gbtree',
                 'objective': 'binary:logistic',
                 'grow_policy': 'depthwise',
                 'tree_method': 'hist',
                 'eval_metric': 'error',
                 'max_depth': 5,
                 'min_child_weight': 0}

        watchlist = [(dtest, 'eval'), (dtrain, 'train')]
        num_round = 5

        def run_trial():
            res = {}
            bst = xgb.train(param, dtrain, num_round, watchlist, evals_result=res)
            metrics = [res['train']['error'][-1], res['eval']['error'][-1]]
            preds = bst.predict(dtest)
            return metrics, preds

        def consist_test(title, n):
            auc, pred = run_trial()
            for i in range(n-1):
                auc2, pred2 = run_trial()
                try:
                    assert auc == auc2
                    assert np.array_equal(pred, pred2)
                except Exception as e:
                    print('-------test %s failed, num_trial: %d-------' % (title, i))
                    raise e
                auc, pred = auc2, pred2
            return auc, pred

        print('test approx ...')
        param['tree_method'] = 'approx'

        n_trials = 10
        param['nthread'] = 1
        auc_1, pred_1 = consist_test('approx_thread_1', n_trials)

        param['nthread'] = 2
        auc_2, pred_2 = consist_test('approx_thread_2', n_trials)

        param['nthread'] = 3
        auc_3, pred_3 = consist_test('approx_thread_3', n_trials)

        assert auc_1 == auc_2 == auc_3
        assert np.array_equal(auc_1, auc_2)
        assert np.array_equal(auc_1, auc_3)

        print('test hist ...')
        param['tree_method'] = 'hist'

        param['nthread'] = 1
        auc_1, pred_1 = consist_test('hist_thread_1', n_trials)

        param['nthread'] = 2
        auc_2, pred_2 = consist_test('hist_thread_2', n_trials)

        param['nthread'] = 3
        auc_3, pred_3 = consist_test('hist_thread_3', n_trials)

        assert auc_1 == auc_2 == auc_3
        assert np.array_equal(auc_1, auc_2)
        assert np.array_equal(auc_1, auc_3)

    @pytest.mark.skipif(**tm.no_sklearn())
    def test_with_omp_thread_limit(self):
        args = [
            "python", os.path.join(
                os.path.dirname(tm.normpath(__file__)), "with_omp_limit.py"
            )
        ]
        results = []
        with tempfile.TemporaryDirectory() as tmpdir:
            for i in (1, 2, 16):
                path = os.path.join(tmpdir, str(i))
                with open(path, "w") as fd:
                    fd.write("\n")
                cp = args.copy()
                cp.append(path)

                env = os.environ.copy()
                env["OMP_THREAD_LIMIT"] = str(i)

                status = subprocess.call(cp, env=env)
                assert status == 0

                with open(path, "r") as fd:
                    results.append(float(fd.read()))

        for auc in results:
            np.testing.assert_allclose(auc, results[0])