【发布时间】:2018-12-09 11:03:50
【问题描述】:
我有一个项目,我正在 Haskell 中构建一个 Decision Tree。 生成的树会有多个相互独立的分支,所以我认为它们可以并行构建。
DecisionTree 数据类型定义如下:
data DecisionTree =
Question Filter DecisionTree DecisionTree |
Answer DecisionTreeResult
instance NFData DecisionTree where
rnf (Answer dtr) = rnf dtr
rnf (Question fil dt1 dt2) = rnf fil `seq` rnf dt1 `seq` rnf dt2
这是构造树的算法部分
constructTree :: TrainingParameters -> [Map String Value] -> Filter -> Either String DecisionTree
constructTree trainingParameters trainingData fil =
if informationGain trainingData (parseFilter fil) < entropyLimit trainingParameters
then constructAnswer (targetVariable trainingParameters) trainingData
else
Question fil <$> affirmativeTree <*> negativeTree `using` evalTraversable parEvalTree
where affirmativeTree = trainModel trainingParameters passedTData
negativeTree = trainModel trainingParameters failedTData
passedTData = filter (parseFilter fil) trainingData
failedTData = filter (not . parseFilter fil) trainingData
parEvalTree :: Strategy DecisionTree
parEvalTree (Question f dt1 dt2) = do
dt1' <- rparWith rdeepseq dt1
dt2' <- rparWith rdeepseq dt2
return $ Question f dt1' dt2'
parEvalTree ans = return ans
trainModel 递归调用constructTree。
并行性的相关行是
Question fil <$> affirmativeTree <*> negativeTree `using` evalTraversable parEvalTree
我正在使用 GHC 标志 -threaded -O2 -rtsopts -eventlog 构建它并运行它
stack exec -- performance-test +RTS -A200M -N -s -l
(我在 2 核机器上)。
但它似乎没有并行运行任何东西
SPARKS: 164 (60 converted, 0 overflowed, 0 dud, 0 GC'd, 104 fizzled)
INIT time 0.000s ( 0.009s elapsed)
MUT time 29.041s ( 29.249s elapsed)
GC time 0.048s ( 0.015s elapsed)
EXIT time 0.001s ( 0.006s elapsed)
Total time 29.091s ( 29.279s elapsed)
我怀疑rdeepseq 的递归调用和并行策略可能存在一些问题。如果有经验丰富的 Haskeller 加入,那真的会让我很开心:)
【问题讨论】:
-
你能提供完整的源代码吗,比如在 GitHub 上?我需要修补这个。
-
是的,repo 可以在这里找到:github.com/AxelUlmestig/decision-tree-haskell 非常感谢您提供帮助。
标签: haskell parallel-processing tree