2017-08-01 1 views
0

GLMモデルのサイズは約2 GBです。このモデルを使用してREST APIをサービスしています。我々は< 3秒の応答時間が必要です。問題は、従来のsaveRDS/readRDS関数の使用には時間がかかりすぎるということです。私たちの最後の選択肢は、セッション間でRモデルをメモリに保持する方法を見つけることです。ハイレベルで残りのAPIのためにRモデルをメモリに保持する

  1. サービスのREST API。

  2. メモリにマルチギガバイトのモデルを保存します。

  3. 応答時間を3秒未満に保ちます。

我々が試したと動作しないスタッフ:

  1. モデルのサイズを縮小。私たちのデータ科学者は、彼がそれを得ることができるほど小さいと言います。

  2. 私は、saveRDSで圧縮やその他の設定を試しました。私ができることは、ファイルからモデルを読み込むのに12秒かかることです。

  3. Microsoft R Serverを試しました。すべてのWeb APIリクエストは同じセッションにリダイレクトされます。問題は、セッションを生き生きとした状態に保つためにまともな量のコードをラップする必要があったことです。それでも、それは頻繁に剥がれます。

  4. Microsoft R Server Real Timeは、ScaleRによって生成されたモデルのみを受け入れるため、タイムアウトしています。私はScaleRにGLM機能があることを知っていますが、私はオプションではないと言われてきました。

  5. 高速IOは役に立たないようです。ボトルネックはrDataファイルの非直列化です。 Rはシングルスレッドでは役に立ちません。

編集: 質問はREST APIライブラリ/サービスのためのRが、私たちは、ステートフル呼び出しの間でメモリモデルを維持することが可能になるものです。

+1

あなたの質問は何ですか? – user3640617

+0

2 GB GLM:思考:私はあなたがそれを小さくすることはできないことをもう一度確認します。 – Zach

+1

私はGLMモデルが訓練データのコピーを保存しておくことが問題だと思います。単に係数をエクスポートして手動でスコア化するだけでは(つまり、APIにスコアを生成させる)のはなぜですか?単純な線形モデルでは、y = Beta1 * var1 + Beta2 * var2 ...などのように簡単なはずです。 – BigTimeStats

答えて

0

上記のコメントと@TenniStatsの提案を続けると、最良の方法はGLMのサイズを減らすことです。次のことを考えてみましょう:

#generating some sample data that's fairly large 
sample.data <- data.frame('target' = sample(c(1:10), size = 5000000, replace = T), 
          'regressor1' = rnorm(5000000), 
          'regressor2' = rnorm(5000000), 
          'regressor3' = rnorm(5000000), 
          'regressor4' = rnorm(5000000), 
          'regressor5' = rnorm(5000000), 
          'regressor6' = rnorm(5000000), 
          'regressor7' = rnorm(5000000), 
          'regressor8' = rnorm(5000000), 
          'regressor9' = rnorm(5000000), 
          'regressor10' = rnorm(5000000)) 

#building a toy glm - this one is about 3.3 GB 
lm.mod <- glm(sample.data, formula = target ~ ., family = gaussian) 

#baseline predictions 
lm.default.preds <- predict(lm.mod, sample.data) 

#extracting coefficients 
lm.co <- coefficients(lm.mod) 

#applying coefficients to original data set by row and adding intercept 
lightweight.preds <- lm.co[1] + 
    apply(sample.data[,2:ncol(sample.data)], 
     1, 
     FUN = function(x) sum(x * lm.co[2:length(lm.co)])) 

#clearing names from vector for comparison 
names(lm.default.preds) <- NULL 

#taa daa 
all.equal(lm.default.preds, lightweight.preds) 

その後、我々は、以下の操作を行うことができます。

#saving for our example and starting timing 
saveRDS(lm.co, file = 'myfile.RDS') 
start.time <- Sys.time() 

#reading from file 
coefs.from.file <- readRDS('myfile.RDS') 
#scoring function 
light.scoring <- function(coeff, new.data) { 
    prediction <- coeff[1] + sum(coeff[2:length(coeff)] * new.data) 
    names(prediction) <- NULL 
    return(prediction) 
} 

#same as before 
light.scoring(coefs.from.file, sample.data[1, 2:11]) 
#~.03 seconds on my machine 
Sys.time() - start.time 
+0

データ科学者とチャットをしました。大きな問題は、予測と一緒になるために信頼度と確率の間隔を計算する必要があることです。これは私たちに下降する道を与えます。 –

関連する問題