From 74d3329f05d7a288b0c0b25ddfb09874d13bf617 Mon Sep 17 00:00:00 2001 From: Dave Liepmann Date: Tue, 30 Apr 2019 09:40:47 +0200 Subject: [PATCH 1/3] Clojure BERT example: minor code cleanup * Remove unused requires * Remove unused vars & function * Use `io` alias --- .../examples/bert-qa/src/bert_qa/infer.clj | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/contrib/clojure-package/examples/bert-qa/src/bert_qa/infer.clj b/contrib/clojure-package/examples/bert-qa/src/bert_qa/infer.clj index 836684e04977..d0f0ebe5073a 100644 --- a/contrib/clojure-package/examples/bert-qa/src/bert_qa/infer.clj +++ b/contrib/clojure-package/examples/bert-qa/src/bert_qa/infer.clj @@ -15,13 +15,10 @@ ;; limitations under the License. ;; - (ns bert-qa.infer (:require [clojure.string :as string] - [clojure.reflect :as r] [cheshire.core :as json] [clojure.java.io :as io] - [clojure.set :as set] [org.apache.clojure-mxnet.dtype :as dtype] [org.apache.clojure-mxnet.context :as context] [org.apache.clojure-mxnet.layout :as layout] @@ -30,11 +27,7 @@ [clojure.pprint :as pprint])) (def model-path-prefix "model/static_bert_qa") -;; epoch number of the model -(def epoch 2) -;; the vocabulary used in the model -(def model-vocab "model/vocab.json") -;; the input question + ;; the maximum length of the sequence (def seq-length 384) @@ -60,7 +53,7 @@ (into tokens (repeat (- num (count tokens)) pad-item)))) (defn get-vocab [] - (let [vocab (json/parse-stream (clojure.java.io/reader "model/vocab.json"))] + (let [vocab (json/parse-stream (io/reader "model/vocab.json"))] {:idx->token (get vocab "idx_to_token") :token->idx (get vocab "token_to_idx")})) @@ -68,9 +61,6 @@ (let [unk-idx (get token->idx "[UNK]")] (mapv #(get token->idx % unk-idx) tokens))) -(defn idxs->tokens [idx->token idxs] - (mapv #(get idx->token %) idxs)) - (defn post-processing [result tokens] (let [output1 (ndarray/slice-axis result 2 0 1) output2 (ndarray/slice-axis result 2 1 2) From cc96496ece52929c4fd266618c8d88e1d19297c7 Mon Sep 17 00:00:00 2001 From: Dave Liepmann Date: Tue, 30 Apr 2019 09:40:47 +0200 Subject: [PATCH 2/3] Clojure BERT example: whitespace fix --- contrib/clojure-package/examples/bert-qa/src/bert_qa/infer.clj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/clojure-package/examples/bert-qa/src/bert_qa/infer.clj b/contrib/clojure-package/examples/bert-qa/src/bert_qa/infer.clj index d0f0ebe5073a..f6282f6edada 100644 --- a/contrib/clojure-package/examples/bert-qa/src/bert_qa/infer.clj +++ b/contrib/clojure-package/examples/bert-qa/src/bert_qa/infer.clj @@ -59,7 +59,7 @@ (defn tokens->idxs [token->idx tokens] (let [unk-idx (get token->idx "[UNK]")] - (mapv #(get token->idx % unk-idx) tokens))) + (mapv #(get token->idx % unk-idx) tokens))) (defn post-processing [result tokens] (let [output1 (ndarray/slice-axis result 2 0 1) From 56227654831b26e21b60e6ce4a16f88884c4eeb1 Mon Sep 17 00:00:00 2001 From: Dave Liepmann Date: Tue, 30 Apr 2019 09:52:33 +0200 Subject: [PATCH 3/3] Clojure BERT example: allow running with GPU The `infer` function accepts a CPU/GPU context, which the command line version of this example exposes as a `:cpu`/`:gpu` keyword. Previously, these options were ignored and the context was overridden to the default context (CPU). This commit allows users (both REPL and shell) to pass in a GPU context. --- .../examples/bert-qa/README.md | 5 +-- .../examples/bert-qa/src/bert_qa/infer.clj | 37 +++++++++++-------- 2 files changed, 23 insertions(+), 19 deletions(-) diff --git a/contrib/clojure-package/examples/bert-qa/README.md b/contrib/clojure-package/examples/bert-qa/README.md index 9a21bcdfd66b..55f13e671c00 100644 --- a/contrib/clojure-package/examples/bert-qa/README.md +++ b/contrib/clojure-package/examples/bert-qa/README.md @@ -57,9 +57,8 @@ Some sample questions and answers are provide in the `squad-sample.edn` file. So * `lein install` in the root of the main project directory * cd into this project directory and do `lein run`. This will execute the cpu version. - -`lein run :cpu` - to run with cpu -`lein run :gpu` - to run with gpu + * `lein run` or `lein run :cpu` to run with cpu + * `lein run :gpu` to run with gpu ## Background diff --git a/contrib/clojure-package/examples/bert-qa/src/bert_qa/infer.clj b/contrib/clojure-package/examples/bert-qa/src/bert_qa/infer.clj index f6282f6edada..9dcc783ff1ac 100644 --- a/contrib/clojure-package/examples/bert-qa/src/bert_qa/infer.clj +++ b/contrib/clojure-package/examples/bert-qa/src/bert_qa/infer.clj @@ -121,22 +121,23 @@ :tokens tokens :qa-map qa-map})) -(defn infer [ctx] - (let [ctx (context/default-context) - predictor (make-predictor ctx) - {:keys [idx->token token->idx]} (get-vocab) +(defn infer + ([] (infer (context/default-context))) + ([ctx] + (let [predictor (make-predictor ctx) + {:keys [idx->token token->idx]} (get-vocab) ;;; samples taken from https://rajpurkar.github.io/SQuAD-explorer/explore/v2.0/dev/ - question-answers (clojure.edn/read-string (slurp "squad-samples.edn"))] - (doseq [qa-map question-answers] - (let [{:keys [input-batch tokens qa-map]} (pre-processing ctx idx->token token->idx qa-map) - result (first (infer/predict-with-ndarray predictor input-batch)) - answer (post-processing result tokens)] - (println "===============================") - (println " Question Answer Data") - (pprint/pprint qa-map) - (println) - (println " Predicted Answer: " answer) - (println "==============================="))))) + question-answers (clojure.edn/read-string (slurp "squad-samples.edn"))] + (doseq [qa-map question-answers] + (let [{:keys [input-batch tokens qa-map]} (pre-processing ctx idx->token token->idx qa-map) + result (first (infer/predict-with-ndarray predictor input-batch)) + answer (post-processing result tokens)] + (println "===============================") + (println " Question Answer Data") + (pprint/pprint qa-map) + (println) + (println " Predicted Answer: " answer) + (println "===============================")))))) (defn -main [& args] (let [[dev] args] @@ -146,4 +147,8 @@ (comment - (infer :cpu)) + (infer) + + (infer (context/gpu)) + + )