Hi Qing

I didn't know about the type parser, I had a look at the code. Nice idea !

Pedro

On Wed, May 2, 2018 at 8:57 PM, Qing Lan <lanking...@live.com> wrote:

> Hi Pedro,
>
> Thanks for your comments!
>
> For the first one: please see the definition for attr here:
> https://mxnet.incubator.apache.org/api/python/symbol/
> symbol.html?highlight=attr#mxnet.symbol.Symbol.attr. It is a user defined
> Struct.  Our old API indeed using null instead of Option + None
> configuration and the new API will go Option + None.
>
> For Second one, the new API provide the type for attribute:
> e.g: def Activation(data : Option[Symbol], act_type : String, name :
> Option[String], attr : Option[Map[String, String]])
> def Pad(data : Option[Symbol] = None, mode : String, pad_width : Shape,
> constant_value : Option[Double] = None, name : Option[String] = None, attr
> : Option[Map[String, String]] = None)
> And you are right, that's exactly we are working on now, make a parser for
> Scala to C++ Type, see here:
> https://github.com/lanking520/incubator-mxnet/blob/scala-
> macros-impl/scala-package/macros/src/main/scala/org/
> apache/mxnet/SymbolMacro.scala#L147
>
> Thanks,
> Qing
>
> On 5/2/18, 3:50 AM, "Pedro Larroy" <pedro.larroy.li...@gmail.com> wrote:
>
>     Hi
>
>     I had a brief look and I have some comments:
>
>     1 - Excessive use of Option: Having an optional map is often not
> necessary.
>     What's the semantic difference between an empty map and passing None?
> What
>     about a variable argument list of Pairs like:
>
>     (attr: Pair[String,Sring]*)     it can be then called like ("lr" ->
> "0.01",
>     "activation" -> "relu")   with variable number of arguments.
>
>     null is definitely bad, but we can have an empty map or other default
>     arguments that make sense in some cases, like an empty string for name
>     instead of an optional string. I'm very much pro Option instead of
> null but
>     it adds clunkiness that is not always necessary, as explained.
>
>     2 - One of the fundamental problems is that the arguments are untyped,
> of
>     type String -> String, I don't see this solved in this proposal. Is it
>     possible to do something better, ie. have typed arguments? when we
> extend
>     dmlc::Parameter we actually know the C++ type, we could do something
> smart
>     about this. For example using clang to extract the types and generate
> the
>     API with proper types.
>
>
>     Pedro.
>
>     On Wed, May 2, 2018 at 4:01 AM, Naveen Swamy <mnnav...@gmail.com>
> wrote:
>
>     > No, the implementation still comes from MXNet backend.
>     > I don't think there would be any overhead unlike C++ with virtual
>     > functions, Interface or trait is just telling you what the signature
> looks
>     > like. users program against interfaces and can choose a different
>     > implementation if they like. For example(only to explain the topic)
> if we
>     > had different implementations for CPU and GPU, they could simply
> choose the
>     > version of Implementation they like. To visualize think of a bridge
> design
>     > pattern.
>     >
>     >
>     >
>     > On Tue, May 1, 2018 at 6:49 PM, Marco de Abreu <
>     > marco.g.ab...@googlemail.com
>     > > wrote:
>     >
>     > > Hey Naveen,
>     > >
>     > > I'm not familiar with Scala, so please correct me if I'm wrong
> with my
>     > > assumptions. This basically sounds like we'd have an interface for
> the
>     > > Scala API and a separate implementation, right?
>     > >
>     > > In general, I really like these decoupled approaches (you already
>     > > highlighted the advantages)! It would introduce a small overhead
> since
>     > we'd
>     > > have to define the traits and implementation at two (different)
>     > locations,
>     > > but it definitely increases clarity and separates concerns. I
> don't think
>     > > we will have multiple implementations in future, but this might
> allow us
>     > to
>     > > define the user-facing API in form of traits while allowing us to
> change
>     > > the underlying "glue" as we want.
>     > >
>     > > My only slight concern is that this would introduce a bit more
> overhead
>     > > since the documentation and API are defined somewhere else, but I
> have no
>     > > experience with Scala, so I'll leave this up to the people who are
> more
>     > > familiar with the topic.
>     > >
>     > > Best regards,
>     > > Marco
>     > >
>     > > On Tue, May 1, 2018 at 11:48 PM, Naveen Swamy <mnnav...@gmail.com>
>     > wrote:
>     > >
>     > > > I think this project is going to significantly improve the
> usability of
>     > > > MXNet-Scala APIs.
>     > > >
>     > > > I had a offline discussion with Qing about this. I agree with
> Yizhi
>     > that
>     > > > keeping in the same namespace will make it easy for existing and
> new
>     > > users
>     > > > to quickly lookup the APIs. Along with that I have one
> recommendation,
>     > > > first generate a trait for all the APIs and have the the
> instance in
>     > the
>     > > > existing symbol. The usage would be something like below:
>     > > >
>     > > > trait SymbolAPIBase {
>     > > > /**
>     > > > api doc
>     > > > */
>     > > > def Activation()
>     > > > }
>     > > >
>     > > > object SymbolAPI extends SymbolAPIBase {
>     > > > def Activation()
>     > > > }
>     > > >
>     > > > object Symbol {
>     > > >  val api: SymbolBase = new SymbolAPI()
>     > > > }
>     > > >
>     > > > Now users would use it as
>     > > > Symbol.api.Activation()
>     > > >
>     > > > Creating a trait/Interface as several advantages:
>     > > > 1) User do not have to know which concrete class to use, can be
> decided
>     > > > later(Dependency Injection or Configuration driven application)
>     > > > 2) Easier to change the implementation later without breaking
> the user
>     > > code
>     > > > -> You can insert different implementations through
> configuration using
>     > > > frameworks such as Spring, etc., -> This is standard in most JVM
> driven
>     > > > projects
>     > > > 3) Easier to Unit test -> You can create Mocks easily using
> Mockito
>     > > > 4) helps with multiple inheritance…you cannot inherit multiple
> classes
>     > > >
>     > > > Let me know what do you guys think.
>     > > >
>     > > > Thanks, Naveen
>     > > >
>     > > > On Sun, Apr 22, 2018 at 9:09 PM, YiZhi Liu <liuyi...@apache.org>
>     > wrote:
>     > > >
>     > > > > I personally like the design here. Since we have seen technical
>     > > > > difficulties of compatibility, I would like to ask people pay
>     > > > > attention to the 'How to combine with existing APIs' section:
>     > > > > https://cwiki.apache.org/confluence/display/MXNET/
>     > > > > MXNet+Scala+API+Usability+Improvement#
> MXNetScalaAPIUsabilityImprovem
>     > > ent-
>     > > > > HowtocombinewithexistingAPIs
>     > > > >
>     > > > > Qing proposed three options,
>     > > > >
>     > > > > 1. Add a new Class/Object called "NewSymbol/NDArray" with full
>     > > > > implementation.
>     > > > > 2. Create a new Class and change the name space for all of the
>     > > > > functions (e.g Activation -> NewActivation) and let
> Symbol/NDArray
>     > > > > extends that.
>     > > > > 3. Create a new Class and override the Same functions with
> different
>     > > > > implementations.
>     > > > >
>     > > > > If we have to choose from option 1 and 2, I would like to +0.5
> for
>     > > > > option 2, with which users can quickly aware of the new
> easy-to-use
>     > > > > API: they type 'Symbol.' in IDE as usual and these functions
> pop up.
>     > > > >
>     > > > > 2018-04-19 10:58 GMT-07:00 Qing Lan <lanking...@live.com>:
>     > > > > > Hi All,
>     > > > > >
>     > > > > > I am Qing, one of the Scala API maintainer for MXNet. I
> would like
>     > to
>     > > > > propose a new design on Scala APIs, it will be really helpful
> for
>     > user
>     > > to
>     > > > > use MXNet Symbol/NDArray. This is a follow-up from Naveen’s
> proposal.
>     > > > > >
>     > > > > > Background:
>     > > > > > The current design on Scala would take arguments as
> key-value pair
>     > > and
>     > > > > didn’t provide the type information for different arguments.
> There
>     > are
>     > > > > document missing for different functions which makes it even
> hard to
>     > > use.
>     > > > > >
>     > > > > > Our approach:
>     > > > > > We will provide a better designed Scala API for user to use
> with
>     > full
>     > > > > documentation and arguments definition. All arguments will be
>     > > > specifically
>     > > > > targeted to different functions. Please see one example that
> we show
>     > in
>     > > > the
>     > > > > Wiki<https://cwiki.apache.org/confluence/display/MXNET/
>     > > > > MXNet+Scala+API+Usability+Improvement> and leave any thoughts
> you
>     > may
>     > > > > have. This wiki includes examples, targets and scenarios we
> have so
>     > > far.
>     > > > > >
>     > > > > > Thanks,
>     > > > > > Qing
>     > > > >
>     > > > >
>     > > > >
>     > > > > --
>     > > > > Yizhi Liu
>     > > > > DMLC member
>     > > > > Amazon Web Services
>     > > > > Vancouver, Canada
>     > > > >
>     > > >
>     > >
>     >
>
>
>

Reply via email to