clulab / scala-transformers

Scala interfaces to huggingface transformers and tokenizers
10 stars 0 forks source link

Fix usage of vertcat #52

Open MihaiSurdeanu opened 8 months ago

MihaiSurdeanu commented 8 months ago

Hi @kwalcock ,

I started the branch revert-to-concat, which does what the name says. However, it crashes on the usage of Math.vertcat in org.clulab.scala_transformers.encoder.LinearLayer (there are 2 calls). Can you please take a look? It may be that one of the vectors needs to transposed, but I'm not sure. Thank you!

MihaiSurdeanu commented 8 months ago

Running the TokenClassifierExampleApp produces this exception:

[info] Words: Ras1, has, phosphorylated, Mek2, .
[info] The top label per token per task:
[error] Exception in thread "main" java.lang.AssertionError: assertion failed
[error]         at scala.Predef$.assert(Predef.scala:208)
[error]         at org.clulab.scala_transformers.encoder.math.EjmlMath$.vertcat(EjmlMath.scala:87)
[error]         at org.clulab.scala_transformers.encoder.LinearLayer.$anonfun$concatenateModifiersAndHeads$1(LinearLayer.scala:101)
[error]         at scala.collection.immutable.Range.foreach$mVc$sp(Range.scala:158)
[error]         at org.clulab.scala_transformers.encoder.LinearLayer.concatenateModifiersAndHeads(LinearLayer.scala:90)
[error]         at org.clulab.scala_transformers.encoder.LinearLayer.$anonfun$predictDual$2(LinearLayer.scala:162)
[error]         at scala.collection.TraversableLike.$anonfun$map$1(TraversableLike.scala:286)
[error]         at scala.collection.IndexedSeqOptimized.foreach(IndexedSeqOptimized.scala:36)
[error]         at scala.collection.IndexedSeqOptimized.foreach$(IndexedSeqOptimized.scala:33)
[error]         at scala.collection.mutable.ArrayOps$ofRef.foreach(ArrayOps.scala:198)
[error]         at scala.collection.TraversableLike.map(TraversableLike.scala:286)
[error]         at scala.collection.TraversableLike.map$(TraversableLike.scala:279)
[error]         at scala.collection.mutable.ArrayOps$ofRef.map(ArrayOps.scala:198)
[error]         at org.clulab.scala_transformers.encoder.LinearLayer.predictDual(LinearLayer.scala:160)
[error]         at org.clulab.scala_transformers.encoder.LinearLayer.predict(LinearLayer.scala:51)
[error]         at org.clulab.scala_transformers.encoder.LinearLayer.predict(LinearLayer.scala:44)
[error]         at org.clulab.scala_transformers.encoder.TokenClassifier.$anonfun$predict$3(TokenClassifier.scala:147)
[error]         at scala.collection.immutable.Range.foreach$mVc$sp(Range.scala:158)
[error]         at org.clulab.scala_transformers.encoder.TokenClassifier.predict(TokenClassifier.scala:145)
[error]         at org.clulab.scala_transformers.apps.TokenClassifierExampleApp$.delayedEndpoint$org$clulab$scala_transformers$apps$TokenClassifierExampleApp$1(TokenClassifierExampleApp.scala:22)
[error]         at org.clulab.scala_transformers.apps.TokenClassifierExampleApp$delayedInit$body.apply(TokenClassifierExampleApp.scala:5)
[error]         at scala.Function0.apply$mcV$sp(Function0.scala:39)
[error]         at scala.Function0.apply$mcV$sp$(Function0.scala:39)
[error]         at scala.runtime.AbstractFunction0.apply$mcV$sp(AbstractFunction0.scala:17)
[error]         at scala.App.$anonfun$main$1$adapted(App.scala:80)
[error]         at scala.collection.immutable.List.foreach(List.scala:431)
[error]         at scala.App.main(App.scala:80)
[error]         at scala.App.main$(App.scala:78)
[error]         at org.clulab.scala_transformers.apps.TokenClassifierExampleApp$.main(TokenClassifierExampleApp.scala:5)
[error]         at org.clulab.scala_transformers.apps.TokenClassifierExampleApp.main(TokenClassifierExampleApp.scala)
[error] Nonzero exit code returned from runner: 1
kwalcock commented 8 months ago

I'm pushing a fix momentarily. At one time the code was

 val concatState = DenseVector.vertcat(modHiddenState.t, headHiddenState.t).t

bit it was changed later to

      val concatState = Math.horcat(modHiddenState, headHiddenState)

so I think the vertcat just needs to be changed to horcat.

MihaiSurdeanu commented 8 months ago

After merging, the error changes:

[info] Words: Ras1, has, phosphorylated, Mek2, .
[info] The top label per token per task:
[error] Exception in thread "main" org.ejml.MatrixDimensionException: 1536 != 768 The 'A' and 'B' matrices do not have compatible dimensions
[error]     at org.ejml.UtilEjml.assertShape(UtilEjml.java:705)
[error]     at org.ejml.dense.row.mult.MatrixMatrixMult_FDRM.mult_reorder(MatrixMatrixMult_FDRM.java:68)
[error]     at org.ejml.dense.row.CommonOps_FDRM.mult(CommonOps_FDRM.java:86)
[error]     at org.ejml.simple.ops.SimpleOperations_FDRM.mult(SimpleOperations_FDRM.java:86)
[error]     at org.ejml.simple.ops.SimpleOperations_FDRM.mult(SimpleOperations_FDRM.java:43)
[error]     at org.ejml.simple.SimpleBase.mult(SimpleBase.java:189)
[error]     at org.clulab.scala_transformers.encoder.math.EjmlMath$.mul(EjmlMath.scala:67)
[error]     at org.clulab.scala_transformers.encoder.LinearLayer.$anonfun$forward$1(LinearLayer.scala:29)
[error]     at scala.collection.TraversableLike.$anonfun$map$1(TraversableLike.scala:286)
[error]     at scala.collection.IndexedSeqOptimized.foreach(IndexedSeqOptimized.scala:36)
[error]     at scala.collection.IndexedSeqOptimized.foreach$(IndexedSeqOptimized.scala:33)
[error]     at scala.collection.mutable.ArrayOps$ofRef.foreach(ArrayOps.scala:198)
[error]     at scala.collection.TraversableLike.map(TraversableLike.scala:286)
[error]     at scala.collection.TraversableLike.map$(TraversableLike.scala:279)
[error]     at scala.collection.mutable.ArrayOps$ofRef.map(ArrayOps.scala:198)
[error]     at org.clulab.scala_transformers.encoder.LinearLayer.forward(LinearLayer.scala:27)
[error]     at org.clulab.scala_transformers.encoder.LinearLayer.$anonfun$predictDual$2(LinearLayer.scala:164)
[error]     at scala.collection.TraversableLike.$anonfun$map$1(TraversableLike.scala:286)
[error]     at scala.collection.IndexedSeqOptimized.foreach(IndexedSeqOptimized.scala:36)
[error]     at scala.collection.IndexedSeqOptimized.foreach$(IndexedSeqOptimized.scala:33)
[error]     at scala.collection.mutable.ArrayOps$ofRef.foreach(ArrayOps.scala:198)
[error]     at scala.collection.TraversableLike.map(TraversableLike.scala:286)
[error]     at scala.collection.TraversableLike.map$(TraversableLike.scala:279)
[error]     at scala.collection.mutable.ArrayOps$ofRef.map(ArrayOps.scala:198)
[error]     at org.clulab.scala_transformers.encoder.LinearLayer.predictDual(LinearLayer.scala:160)
[error]     at org.clulab.scala_transformers.encoder.LinearLayer.predict(LinearLayer.scala:51)
[error]     at org.clulab.scala_transformers.encoder.LinearLayer.predict(LinearLayer.scala:44)
[error]     at org.clulab.scala_transformers.encoder.TokenClassifier.$anonfun$predict$3(TokenClassifier.scala:147)
[error]     at scala.collection.immutable.Range.foreach$mVc$sp(Range.scala:158)
[error]     at org.clulab.scala_transformers.encoder.TokenClassifier.predict(TokenClassifier.scala:145)
[error]     at org.clulab.scala_transformers.apps.TokenClassifierExampleApp$.delayedEndpoint$org$clulab$scala_transformers$apps$TokenClassifierExampleApp$1(TokenClassifierExampleApp.scala:22)
[error]     at org.clulab.scala_transformers.apps.TokenClassifierExampleApp$delayedInit$body.apply(TokenClassifierExampleApp.scala:5)
[error]     at scala.Function0.apply$mcV$sp(Function0.scala:39)
[error]     at scala.Function0.apply$mcV$sp$(Function0.scala:39)
[error]     at scala.runtime.AbstractFunction0.apply$mcV$sp(AbstractFunction0.scala:17)
[error]     at scala.App.$anonfun$main$1$adapted(App.scala:80)
[error]     at scala.collection.immutable.List.foreach(List.scala:431)
[error]     at scala.App.main(App.scala:80)
[error]     at scala.App.main$(App.scala:78)
[error]     at org.clulab.scala_transformers.apps.TokenClassifierExampleApp$.main(TokenClassifierExampleApp.scala:5)
[error]     at org.clulab.scala_transformers.apps.TokenClassifierExampleApp.main(TokenClassifierExampleApp.scala)
[error] Nonzero exit code returned from runner: 1
[error] (apps / Compile / runMain) Nonzero exit code returned from runner: 1
[error] Total time: 17 s, completed Jan 3, 2024 8:27:42 AM
kwalcock commented 8 months ago

FWIW this is on the multiply. A long and short matrix are getting combined.

kwalcock commented 8 months ago

By default it is looking for a local model.

  val tokenClassifier = TokenClassifier.fromFiles("../microsoft-deberta-v3-base-mtl/avg_export")

Does it coincide with the setting for USE_CONCAT?

MihaiSurdeanu commented 8 months ago

Yes... You're right. I thought it's getting the model from the jar (which is correct). The local one is not... I'll fix this locally.

kwalcock commented 8 months ago

I had imagined someone needing to work on it before the models were published and available as resources.