glimmer-dsl-libui 0.5.22 → 0.5.23

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,107 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'onnxruntime'
4
+ require 'blingfire'
5
+ require 'numo/narray'
6
+ require 'fileutils'
7
+ require 'glimmer-dsl-libui'
8
+
9
+ # GPT-2 model
10
+ # Transformer-based language model for text generation.
11
+ # https://github.com/onnx/models/tree/main/text/machine_comprehension/gpt-2
12
+ class GPT2TextPredictor
13
+ attr_accessor :text
14
+
15
+ def initialize
16
+ @text = ''
17
+ base_dir = File.join(Dir.home, '.gpt2-notepad')
18
+ FileUtils.mkdir_p(base_dir)
19
+ Dir.chdir(__dir__) do
20
+ downloaded_files = %w[
21
+ https://github.com/microsoft/BlingFire/raw/master/dist-pypi/blingfire/gpt2.bin
22
+ https://github.com/microsoft/BlingFire/raw/master/dist-pypi/blingfire/gpt2.i2w
23
+ https://github.com/onnx/models/raw/main/text/machine_comprehension/gpt-2/model/gpt2-lm-head-10.onnx
24
+ ].map do |url|
25
+ fname = File.join(base_dir, File.basename(url))
26
+ next(fname) if File.exist?(fname)
27
+
28
+ print "Downloading #{fname}..."
29
+ require 'open-uri'
30
+ File.binwrite(fname, URI.open(url).read)
31
+ puts 'done'
32
+ fname
33
+ end
34
+ @encoder = BlingFire.load_model(downloaded_files[0])
35
+ @decoder = BlingFire.load_model(downloaded_files[1])
36
+ @model = OnnxRuntime::Model.new(downloaded_files[2])
37
+ end
38
+ end
39
+
40
+ def softmax(y)
41
+ Numo::NMath.exp(y) / Numo::NMath.exp(y).sum(1, keepdims: true)
42
+ end
43
+
44
+ def predict(a, prob: true)
45
+ outputs = @model.predict({ input1: [[a]] })
46
+ logits = Numo::DFloat.cast(outputs['output1'][0])
47
+ logits = logits[true, -1, true]
48
+ return logits.argmax unless prob
49
+
50
+ log_probs = softmax(logits)
51
+ idx = log_probs.sort_index
52
+ i = (log_probs[idx].cumsum < rand).count
53
+ idx[i]
54
+ end
55
+
56
+ def predict_text(max = 30)
57
+ a = @encoder.text_to_ids(text)
58
+ max.times do
59
+ id = predict(a)
60
+ a << id
61
+ break if id == 13 # .
62
+ end
63
+ self.text = @decoder.ids_to_text(a)
64
+ end
65
+ end
66
+
67
+ class GPT2Notepad
68
+ include Glimmer::LibUI::Application
69
+
70
+ before_body do
71
+ @text_predictor = GPT2TextPredictor.new
72
+ end
73
+
74
+ body {
75
+ window('Notepad', 500, 300) {
76
+ vertical_box {
77
+ padded true
78
+
79
+ horizontal_box {
80
+ stretchy false
81
+
82
+ button('Clear') {
83
+ on_clicked do
84
+ @text_predictor.text = ''
85
+ end
86
+ }
87
+
88
+ button('Continue the sentence(s)') {
89
+ on_clicked do
90
+ if @text_predictor.text.empty?
91
+ msg_box('Empty!', 'Please enter some text first.')
92
+ else
93
+ @text_predictor.predict_text
94
+ end
95
+ end
96
+ }
97
+ }
98
+
99
+ multiline_entry {
100
+ text <=> [@text_predictor, :text]
101
+ }
102
+ }
103
+ }
104
+ }
105
+ end
106
+
107
+ GPT2Notepad.launch
Binary file
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: glimmer-dsl-libui
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.22
4
+ version: 0.5.23
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andy Maleh
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-08-14 00:00:00.000000000 Z
11
+ date: 2022-09-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: glimmer
@@ -344,6 +344,7 @@ files:
344
344
  - examples/form_table3.rb
345
345
  - examples/form_table4.rb
346
346
  - examples/form_table5.rb
347
+ - examples/gpt2_notepad.rb
347
348
  - examples/grid.rb
348
349
  - examples/histogram.rb
349
350
  - examples/histogram2.rb